中缀表达式转后缀(逆波兰)表达式

原则:

从左到右遍历中缀表达式:

1、如果是数字则直接输出;

2、如果是左括号,直接入栈;

3、如果是右括号,直接栈顶元素出栈并输出,直到遇到左括号,左括号只出栈,不输出;

4、如果是符号,如果优先级不高于栈顶符号则栈顶元素依次出栈并输出

如果遇到+、-符号,如果栈非空并且栈顶元素不是左括号,则出栈并且输出,否则当前符号入栈

如果是*、/符号,如果栈非空且栈顶元素是*或/,则出栈并输出,否则当前符号入栈

大家可以参考网上的一个流程图:https://blog.csdn.net/qq_34992845/article/details/70313588

C++实现代码:

#include<iostream>

#include<algorithm>

#include<string>

#include<stack>

using namespace std;


int main(){

    string s;

    string s_back;

    getline(cin,s);

    stack<char> stk;

    

    for(int i=0;i<s.size();i++){

        if(s[i]>='0'&&s[i]<='9'){

            s_back.push_back(s[i]);

            if(s[i+1]>'9'||s[i+1]<'0')s_back.push_back(' ');  //为了保证多位数比如10的连续输出

        }

        else if(s[i]=='+'||s[i]=='-'){

            while(1){

                if(!stk.empty() && stk.top()!='('){  //表达式中+,-的优先级最低,所以只要栈顶不为‘(’,就都要出栈

                    s_back.push_back(stk.top()); //为了用空格分开

                    s_back.push_back(' ');

                    stk.pop();

                }

                else{

                    stk.push(s[i]);

                    //s_back.push_back(' ');

                    break;

                }

            }

        }

        else if(s[i]=='*'||s[i]=='/'){

            while(1){

                if(!stk.empty() && (stk.top()=='*'|| stk.top()=='/')){  //优先级不高于* /的

                    s_back.push_back(stk.top());

                    s_back.push_back(' ');  //为了用空格分开

                    stk.pop();

                }

                else{

                    stk.push(s[i]);

                    break;

                }

            }

        }

        else if(s[i]=='('){

            stk.push(s[i]);

        }

        else if(s[i]==')'){

            while(1){

                if(stk.top()!='('){

                    s_back.push_back(stk.top());

                    s_back.push_back(' ');  //为了用空格分开

                    stk.pop();

                }

                stk.pop();  //删除'('

                break;

            }

        }

    }

    while(!stk.empty()){

        s_back.push_back(stk.top());

        s_back.push_back(' ');   //为了用空格分开

        stk.pop();

    }

    cout<<s_back<<endl;

    return 0;

}


运行结果:

9+(3-1)*3+10/2

9 3 1 - 3 * + 10 2 / + 

Program ended with exit code: 0


猜你喜欢

转载自blog.csdn.net/weixin_39138071/article/details/79809533