我們平常書寫的表示式:--如2+3*4+4 又稱為中綴表示式,我們可以將它轉換為字尾表示式
213*+4+
輸入有兩行,第一行為逆波蘭式的結果,第二行為輸入表示式的正確計算結果。逆波蘭式中相鄰的數字或運算子之間不用輸出空格
保證表示式計算的合理性,不需判斷除零等情況
表示式的計算遵循同級運算從左向右,先乘除後加減
樣例輸入:
2+1*3+4
樣例輸出:
213*+4+
解題思路:
首先定義兩個棧,乙個臨時儲存運算子s1,另乙個作為輸入逆波蘭式s2的存放棧
在s1中先放入乙個『#』運算子調整為最低,方便運算子的比較
然後開始從表示式中取值
(1)若取出的是表示式,直接將其放置到s2存放棧中
(2)若取出的運算子,則將該元素與s1棧頂元素進行比較,如果該運算子優先順序大於(小於或者等於都不行)s1棧頂運算子優先順序,則將該運算子進s1棧,否則,將s1棧棧的棧頂運算子彈出,送入s2棧,之後再和s1現在的棧頂比較,直到運算子優先順序大於棧頂為止後,將該運算子送入s1中
(3)重複上述1-2步,直到所有輸入字元都處理完畢
(4)將s1中的所有符號除『#』以外都push到s2中
這樣我們就得到了乙個逆波蘭序列
計算結果:
將逆波蘭式依次堆入乙個棧中,如果堆入的是乙個運算子,取出棧裡的頭兩個運算元(必為數字),將其執行運算子所代表的操作後
(一般是 下 運算子 上),將結果放回棧中,最後剩下的棧頂就是結果
**如下:
am>
#include #include #include #include using namespace std;
int precede(char a)
}bool compareprecde(char a,char b)
else
}int main()
else
exprstack.push(buffer[i]);
} }while (exprstack.top() != '#')
while (!numstack.empty())
reverse(opvec.begin(), opvec.end()); //輸出逆波蘭式列
for (auto x : opvec)
cout << endl;
//計算結果
while (!tempstack.empty())
else
} }cout << resstack.top() << endl; //輸出結果
return 0;
}
逆波蘭式轉換
逆波蘭式轉換 1 輸入 算術表示式 字串形式資料 2 輸出 逆波蘭式以及計算結果 轉換過程如下所示 棧底放 從左至右逐字讀取中綴式 a.當當前字元為數字時,直接輸出 b.當當前字元為 時,將其壓棧 c.當當前字元為 時,則彈出堆疊中最上的 之前的所有運算子並輸出,然後刪除堆疊中的 d.當當前字元為運...
簡單的逆波蘭式 c語言
include include include define ok 1 define error 0 const int maxn 20 typedef struct stackstack void init stack s,int size int push stack s,char value ...
編譯原理 逆波蘭式分析計算
將非字尾式用來表示的算術表示式轉換為用逆波蘭式來表示的算術表示式,並計算用逆波蘭式來表示的算術表示式的值。1 逆波蘭式定義 將運算物件寫在前面,而把運算符號寫在後面。用這種表示法表示的表示式也稱做字尾式。逆波蘭式的特點在於運算物件順序不變,運算符號位置反映運算順序。採用逆波蘭式可以很好的表示簡單算術...