1. 程式人生 > >60行c++簡單實現中綴表示式轉字尾

60行c++簡單實現中綴表示式轉字尾

中綴表示式轉字尾表示式演算法


使用棧進行輔助
對於符號±/(),定義為/優先順序為2,’(’(左括號)優先順序為3,右括號’)'優先順序最低為0

對於一個表示式

如果當前字元為數字:
    輸出到輸出佇列中;
否則當前字元是運算子號或者括號時候:
    while 當前優先順序大於棧頂優先順序並且棧不空:
         棧頂元素出棧加入到輸出佇列中;
    將元素壓入棧內;
 while 當前棧非空:
     出棧返回棧頂元素;

對於左右括號問題

把左括號定義為 壓入前是最高的優先順序 壓入後是最低優先順序
這樣一旦遇到左括號一定能被壓入,並且壓入後等級是最低的
定義右括號為第二低低的優先順序 這樣它就可以 一直pop棧元素
然後等遇到左括號 (左括號這個時候是最低的優先順序)的時候
pop左括號


原始碼

#include <iostream>
#include <stack>
#include <cctype>
#include <map>
using namespace std;
int main(int argc, char const *argv[])
{
    map<char, int> ss;
    ss['+'] = 1;
    ss['-'] = 1;
    ss['*'] = 2;
    ss['/'] = 2;
    stack<char> s;
    string express;
while (cin >> express) { for (int i = 0; i < express.length(); i++) { if (isalpha(express[i])) { cout << express[i] << " "; } else if (express[i] == '(') { s.push(
express[i]); } else if (express[i] == ')') { while (s.top() != '(') { cout << s.top() << " "; s.pop(); } s.pop(); } //*/優先順序高因此棧的棧頂是優先順序高的 else { //cout << express[i]; // 當前棧頂的元素優先順序大於當前零時字元 while (!s.empty() && ss[s.top()] >= ss[express[i]]) { cout << s.top() << " "; s.pop(); } s.push(express[i]); } } while (!s.empty()) { cout << s.top() << " "; s.pop(); } cout << endl; } system("pause"); return 0; }

執行結果

在這裡插入圖片描述