1. 程式人生 > >中綴表示式轉字首表示式 c++

中綴表示式轉字首表示式 c++

/**
北理2013年第三題 

2018-8-15 13:42

輸入表示式,輸出相應二叉樹的前序遍歷結果
例如輸入:a+b*(c-d)-e/f
    輸出:-+a*b-cd/ef 

用兩個棧實現,

(1) 初始化兩個棧:運算子棧S1和儲存中間結果的棧S2;
(2) 從右至左掃描中綴表示式;
(3) 遇到運算元時,將其壓入S2;
(4) 遇到運算子時,比較其與S1棧頂運算子的優先順序:
       (4-1) 如果S1為空,或棧頂運算子為右括號“)”,則直接將此運算子入棧;
       (4-2) 否則,若優先順序比棧頂運算子的較高或相等,也將運算子壓入S1;
       (4-3) 否則,將S1棧頂的運算子彈出並壓入到S2中,再次轉到(4-1)與S1中新的棧頂運算子相比較;
(5) 遇到括號時:
      (5-1) 如果是右括號“)”,則直接壓入S1;
      (5-2) 如果是左括號“(”,則依次彈出S1棧頂的運算子,並壓入S2,直到遇到右括號為止,此時將這一對括號丟棄;
(6) 重複步驟(2)至(5),直到表示式的最左邊;
(7) 將S1中剩餘的運算子依次彈出並壓入S2;
(8) 依次彈出S2中的元素並輸出,結果即為中綴表示式對應的字首表示式。

**/ 
#include<iostream>
#include<stack>
#include<string.h>
using namespace std;

int pri(char a){
    switch(a){
        case '+':
            return 1;
        case '-':
            return 1;
        case '*':
            return 2;
        case '/':
            return 2;
    }
}

int main(){
    char express[100];
    stack<char> S1,S2;
    
    cout<<"輸入表示式: ";
    cin>>express; 
    cout<<"您輸入了:"<<express<<endl;
    
    char c;
    
    for(int i=strlen(express)-1;i>=0;i--){
        c=express[i];
        if(c>='a' && c<='z')
            S1.push(c);

        else if(c==')'||S2.empty()==1||S2.top()==')'){
            S2.push(c);
        }
            
        else if(c=='('){
            while(S2.top()!=')'){
                S1.push(S2.top());
                S2.pop();
            }    
            S2.pop();
        }

        else{
            while(S2.empty()==0 && pri(c) < pri(S2.top())){
                S1.push(S2.top());
                S2.pop();
            }
            S2.push(c);
        }            
    }    
    while(S2.empty()!=1){
        S1.push(S2.top());
        S2.pop();
    }
    
    cout<<"輸出      ";
    while(S1.empty()!=1){
        cout<<S1.top();
        S1.pop();
    }
    return 0;