C 中綴轉字尾 字尾轉換得出計算結果

2021-10-01 08:10:10 字數 1977 閱讀 3897

對於簡單的四則運算而言,我們可以結合棧與字串結合,將中綴表示式轉化為字尾表示式,然後將字尾表示式轉化得出計算結果。

將中綴表示式轉化為字尾表示式(棧用來進出 運算的符號)

將字尾表示式進行運算得出結果(棧用來進出 運算的數字)

將中綴表示式轉化乘字尾表示式:

設定: 優先順序 『 ( 』 > 『 * 』 = 『 / 』 > 『 + 』 = 『 - 』

①讀取輸入佇列的字元,判斷是數字還是符號 + - * / ()

②若是數字,放到輸出佇列

③若是『 ) 』,則把stack中的符號彈出到輸出佇列,直到遇到第乙個『(』,且『(』不用放到輸出佇列

④若是其他符號 + - * / (,則把棧中元素彈出,直到發現優先順序更低(優先順序相同也彈出)的符號或者『 ( 』為止。』 ( '只有在遇到『 ) 』時才彈出

將字尾表示式轉化得出結果:

規則:從左到右遍歷表示式的每個數字和符號,遇到是數字就進棧,遇到是符號,就將處於棧頂兩個數字出棧,進行運算,運算結果進棧,一直到最終獲得結果。

**實現:

//侷限性:輸入時必須合法 對於不合法輸入沒有做出處理、數字必須為0~9的範圍 兩位以上的數字沒有實現

#include

#include

#include

#include

using

namespace std;

//中綴轉化為字尾

intinfixtosuffix

(string &infix, string &suffix)

else

if(infix[i]

=='+'

|| infix[i]

=='-'

) s.

push

(infix[i]);

//infix[i]進入符號棧

}else

if(infix[i]

=='*'

|| infix[i]

=='/'

) s.

push

(infix[i]);

//infix[i]進入符號棧

}else

if(infix[i]

=='('

)else

if(infix[i]

==')'

)//此時棧頂元素為 ( 要將其彈出

s.pop();

//彈出 ( }}

//中綴字串處理完成之後 若字元棧不為空 則將其賦值給字尾字串並且彈出

while

(!s.

empty()

)return0;

}//字尾轉化得出結果

float

suffixtovalue

(string &suffix)

else

else

if(suffix[i]

=='-'

)else

if(suffix[i]

=='*'

)else

if(suffix[i]

=='/')}

}return s.

top();

//執行到此處時 棧內只剩計算結果 返回計算結果

}int

main()

cout << endl;

cout<<

"運算結果為:"

<<

suffixtovalue

(suffix)

<

return0;

}

執行結果下圖所示:

**侷限性:

①只實現了0~9的數字輸入,若是兩位以上的數字沒做處理

②沒有異常檢測(假設所有輸入都合法,不合法的輸入會直接導致錯誤輸出)

棧應用 中綴轉字尾 字尾計算

中綴表示式 infix expression 即 平時生活中大家對於算式的書寫格式 eg 6 5 2 3 8 3 字尾表示式 post expression 即 把數字和運算子分開,把運算子的優先順序運算內涵到字尾式的數字和運算子的順序 中 故其 優點就是,沒有必要知道任何優先的規則 乙個運算子只對...

中綴轉字尾,計算結果

import queue 判斷符號優先符 defcompareii a,b if a or a and b or b return 0elif a or b return 0return 1 中綴變字尾 1 乙個數字棧 2 乙個符號棧 3 判斷符號的優先順序 4 數字棧跳到符號棧 5 輸出符號棧 d...

c 實現中綴轉字首,中綴轉字尾,字尾表示式求值

思想 用兩個棧實現,規則如下 1 初始化兩個棧 運算子棧s1和儲存中間結果的棧s2 2 從右至左掃瞄中綴表示式 3 遇到運算元時,將其壓入s2 4 遇到運算子時,比較其與s1棧頂運算子的優先順序 4 1 如果s1為空,或棧頂運算子為右括號 則直接將此運算子入棧 4 2 否則,若優先順序比棧頂運算子的...