中缀表达式转换为后缀表达式(思路)
1.创建栈
2.从左向右顺序获取中缀表达式
a.数字直接输出
b.运算符
情况一:遇到左括号直接入栈,遇到右括号将栈中左括号之后入栈的运算符全部弹栈输出,同时左括号出栈但是不输出。
情况二:遇到乘号和除号直接入栈,直到遇到优先级比它更低的运算符,依次弹栈。
情况三:遇到加号和减号,如果此时栈空,则直接入栈,否则,将栈中优先级高的运算符依次弹栈(注意:加号和减号属于同一个优先级,所以也依次弹栈)直到栈空或者遇到左括号为止,停止弹栈。(因为左括号要匹配右括号时才弹出)。
情况四:获取完后,将栈中剩余的运算符号依次弹栈输出
#include<bits/stdc++.h>
#include<algorithm>
#define N 1000
using namespace std;
int main()
{
string s;
stack<char>st;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9')cout<<s[i];//0-9直接压入栈中
else if(s[i]==')'){//遇上右括号依次弹栈,直到遇上左括号
while(true){
if(st.top()=='('){
st.pop();
break;
}
cout<<st.top();//栈中的左括号及左括号以上其他符号全部弹出
st.pop();
}
}
else{
if(!st.empty()&&(s[i]=='+'||s[i]=='-')&&
(st.top()=='*'||st.top()=='/')){//当遇上加减操作时,有两种情况:1、如果栈为空,则直接压入栈中;
while(!st.empty()){// 2、如果栈不为空,则需要判断与栈顶符号的优先级
if(st.top()=='(')break; //(1)如果栈顶的符号优先级大,依次弹栈直到栈空或者遇上左括号
cout<<st.top(); //(2)否则,直接压入栈中
st.pop();
}
st.push(s[i]);//弹栈操作完成后,再把遇上的符号压入栈中
}
else st.push(s[i]);
}
}
while(!st.empty()){
cout<<st.top();
st.pop();
}
return 0;
}
/*9+(3-1)*3+4/2*/