對於簡單的四則運算而言,我們可以結合棧與字串結合,將中綴表示式轉化為字尾表示式,然後將字尾表示式轉化得出計算結果。
將中綴表示式轉化為字尾表示式(棧用來進出 運算的符號)將中綴表示式轉化乘字尾表示式:將字尾表示式進行運算得出結果(棧用來進出 運算的數字)
設定: 優先順序 『 ( 』 > 『 * 』 = 『 / 』 > 『 + 』 = 『 - 』
①讀取輸入佇列的字元,判斷是數字還是符號 + - * / ()
②若是數字,放到輸出佇列
③若是『 ) 』,則把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 否則,若優先順序比棧頂運算子的...