棧的應用

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。

相關文章
相關標籤/搜索