1、數制轉換算法
例如,把十進制數159轉換成八進制數,如圖spa
159/8=19餘7,19/8=2餘3,2/8=0餘2,咱們發現獲得的結果是倒過來的,由於棧的先進後出的特性,因此能夠用棧來存儲這幾個數,而後輸出出來就是對應的正確的八進制數了。.net
僞代碼:blog
void conversion(){it
InitStack(&S);//構造一個空棧Sio
scanf("%d",&n);for循環
while(n){搜索
push(&S,n%8);//把餘數進棧循環
n=n/8;程序
}
while(!StackEmpty(S)){
Pop(&S,&e);//倒着輸出,即出棧,獲得的餘數
printf("%d",e);
}
}//conversion
2、括號匹配的檢驗
即檢驗括號是否一一對應,如[ ( ) [ ] ]爲正確的格式,( [ ] ( )爲錯誤的格式。
算法描述:
讀入表達式,若遇到左括號進棧,若遇到右括號則檢驗棧頂元素是否和右括號匹配,若匹配則出棧,若不匹配則表達式格式錯誤。若讀完全部的括號,棧爲空,則表達式格式正確,棧不爲空則表達式格式錯誤。
僞代碼:
Status matching(char exp[]){
InitStack(&S);
for(i=0;i<Length(exp);i++){
if(exp[i]=='('||exp[i]=='[')
Push(&S,exp[i]);
else if(exp[i]==')'||exp[i]==']'){
if(StackEmpty(S))
return ERROR;
Pop(&S,e);
if(e!=exp[i]){
exit ERROR;
}
}//for
if(StackEmpty(S))
return OK;
else
return ERROR;
}//matching
3、行編輯程序問題
設立一個輸入緩衝區,用以接受用戶輸入的一行字符,而後逐行存入用戶緩衝區,並假設「#」爲退格符,「@」爲退行符。例如,
whli##ilr#e( s#*s )
outcha@putchar(*s=#++);
實際有效的是以下兩行
while(*s)
putchar(*s++);
算法描述:
一、既不是退格符也不是退行符,則入棧。
二、退格符,棧頂元素出棧。
三、退行符,清空棧。
4、迷宮求解問題,廣度優先搜索(BFS)。
5、表達式求值
中綴表達式轉後綴表達式和前綴表達式:
推薦連接:
①http://blog.csdn.net/antineutrino/article/details/6763722/
1)計算後綴表達式
算法描述:讀入表達式,從左到右讀,遇到數字則入棧,遇到操做符,則連續從棧頂退出兩個元素,計算結果入棧,當表達式全部項處理完後,棧頂元素即爲最後計算結果。
僞代碼:
double calcul_exp(char a[]){
InitStack(&S);
for(i=0;i<Length(a);i++){
if(a[i]!='+'&&a[i]!='-'&&a[i]!='*'&&a[i]!='/'&&a[i]!='%'){
Push(&S,a[i]);
}//if
else{
Pop(&S,a);
Pop(&S,b);
switch(a[i]){
case '+' : c=a+b;break;
case '-' : c=a-b;break;
case '*' : c=a*b;break;
case '\' : c=a/b; break;
case '%' : c=a%b; break; }//switch
Push(&S,c);
}//else
}//for
PopStack(&S,result);
return result;
}//calcul_exp
2)計算前綴表達式
算法描述:從右至左掃描表達式,遇到數字時,將數字壓入堆棧,遇到運算符時,彈出棧頂的兩個數,用運算符對它們作相應的計算,並將結果入棧;重複上述過程直到表達式最左端,最後運算得出的值即爲表達式的結果。
僞代碼:
和計算後綴表達式同樣,只不過for循環i從Length(a)開始到0。