用棧實現表示式轉換

2021-10-08 06:45:18 字數 2369 閱讀 9346

從左到右依次掃瞄中綴表示式,遇到運算元就直接寫出來(順序是從前往後寫),遇到運算子時,判斷當前運算子與棧頂運算子的優先順序,如果當前運算子的優先順序小於或者等於棧頂元素運算子的優先順序,就把棧頂運算子出棧,並將其寫入當前結果表示式中(這個比較是個循壞,依次把當前元素和新的棧頂元素進行比較,如果還是小於等於則繼續出棧,知道比較的是結果是大於棧頂運算子優先順序則把當前運算子出棧)。

對於表示式中含有括號,當遇到左括號則直接入棧,當棧頂元素是左括號時則掃瞄的元素全入棧,當掃瞄的運算子是右括號時則執行一系列出棧操作,把當前棧中從棧頂到左括號的元素全部出棧,並將其寫入結果表示式中,把括號丟棄。

最後當掃瞄完中綴表示式中所有字元時,此時若棧中還有剩餘的運算子,則將其全部出棧並寫入結果表示式中。

描述:首先把運算元a寫入結果表示式,然後把運算子+壓入棧中,然後把b寫入結果表示式,然後運算子-的優先順序等於棧頂元素+的優先順序所以+出棧寫入結果表示式,然後棧空所以把-運算子壓入棧中,然後把a寫入結果表示式,由於乘號運算子的優先順序大於棧頂元素-的優先順序,所以把乘號壓入棧中,然後把兩個左括號壓入棧中,把c寫入結果表示式,把運算子+壓入棧中,把d寫入結果表示式,遇到右括號,把與左括號之間的元素全部出棧並把括號丟棄掉。緊著著是運算子/,由於此時棧頂元素是左括號所以直接入棧,把e寫入結果表示式,由於-運算子的優先順序小於/所以/出棧,然後此時棧頂元素是左括號所以把-壓入棧中,遇到右括號,把與左括號之間的元素依次出棧並把括號丟棄。由於運算子+的優先順序小於乘號,所以乘號出棧,又等於-的優先順序所以-出棧,此時棧空把+壓入棧中,把運算元g寫入結果表示式,此時已經掃瞄完表示式中所有字元,所以把棧中所剩的+出棧。

注意:本例中轉換過程中在棧中的操作符的最大個數是5

和轉前轉字首式乙個相反的過程,這個需要從右往左依次掃瞄。寫結果表示式是從後往前寫。

遇到右括號入棧遇到左括號把它們之間的元素全部出棧。還有一點,在轉字尾時,如果此時運算子的優先順序小於或者等於棧頂運算子優先順序則出棧,而在轉字首時是小於。

字尾轉字首:每次掃瞄到乙個運算子時,就把這個運算子所對應的兩個子表示式移到運算子後面。(這個移動的過程我們借助棧來實現)

void

infixtopostfix

(char infix,

char s2,

int&top2)

//第乙個引數是中綴表示式串,後面兩個引數是乙個棧,用來儲存轉換之後的結果

//如果掃瞄的是左括號則直接入輔助棧

else

if(infix[i]

==' ( '

)//然後處理運算子

else

if(infix[i]

==』+』||infix[i]

==』-『||infix[i]

==』*』||infix==』/』)

//如果輔助棧為空或者棧頂元素是左括號或者此時元素的優先順序大於棧頂元素的優先順序則入輔助棧

//否則就把s1棧頂元素出棧然**s2棧

else

s2[++top2]

=s1[top1--];

//s1棧頂元素出棧然**s2棧

}//對右括號進行處理

else

if(infix[i]

==』)『)

}//把輔助棧s1中剩餘的元素全部出棧併入s2棧

while

(top1!=-1

) s2[

++top2]

=s1[top1--];

}

(這個和上面一樣,只不過掃瞄順序需要改變為從右到左,然後左右括號對調一下,注意一下運算優先順序**的判斷,入棧的操作變成大於等於)

void

infixtoprefix

(char infix,

int len,

char s2,

int&top2)

//因為需要從後往前掃瞄所以需要知道表示式的長度

else

if(infix[i]

=』)』)

else

if(infix[i]

=='+'

||infix[i]

=='-'

|| infix[i]

=='*'

||infix[i]

=='/'

)else

s2[++top2]

=s1[top1--];

}else

if(infix[i]

==』(『)

}while

(top1!=-1

) s2[

++top2]

=s1[top1--];

}

用棧實現中綴表示式轉換為字尾表示式

思路 1.從左到右獲取中綴表示式 2.的優先順序最高,遇到直接入棧,直到遇到比他優先順序低的,依次出棧 3.遇到直接入棧,等遇到右括號 後,將 棧的運算子出棧輸出,出棧不輸出 4.如果棧空,直接入棧,否則將棧中優先順序不低於它們的運算子依次彈出,直到棧空或遇到 為止 如下所示 中綴轉字尾 void ...

用棧實現表示式計算

public class calculator public static inthandle string express else else else else int num integer.parseint keepnum keepnum numstack.push num index if...

用棧實現表示式計算 C

思路 1.首先建立倆個棧,乙個存資料 datastack 另乙個存運算子 operatorstack 2.表示式計算 資料 datasatck,運算子 operatorstack if 當運算子棧為空時 將第乙個運算子放入棧中 else if 此時的運算子的優先順序 棧頂的運算子優先順序 運算子入棧...