4种情况分析:
(1)遇到运算符直接输出;
(2)遇到左括号,直接压栈;
(3)遇到右括号,将栈顶的运算符弹出并输出;(直到遇到左括号,左括号出栈,但不输出)
(4)遇到的是运算符,若该运算符的优先级大于栈顶运算符的优先级,则压栈;否则将栈顶运算符弹出并输出;
代码实现如下:
#include<stack>
#include <iostream>
#include<string>
#include<sstream>
using namespace std;
int pri (char c);//判断运算符优先级
string tran(char a[]);//中缀运算符转后缀运算符
int main()
{
char str[100];
cin.getline(str, 100);//读入中缀表达式
string a=tran(str);
cout << a << endl;
return 0;
}
int pri(char c)
{
if(c == '+' || c=='-')
return 1;
else if(c =='*' ||c=='/')
return 2;
else if(c=='(')
return 0;
}
string tran(char a[])
{
int i;
char c;
stack<char> st;//建立一个运算符堆栈
stringstream ss;//定义字符串流类
for(i=0;a[i];i++)
{
c=a[i];//为方便写
if(c == '+' || c=='-'||c =='*' ||c=='/')
{
if((c == '+' || c=='-') && (i==0 || a[i-1]=='('))//判断正负号 ?-9+(+5*7)
{
ss << (c=='-' ? "-":"");
}
else
{
ss << " ";
while(!st.empty() && pri(st.top()) >= pri(c)) //当算数优先级小于栈顶算算数符的t优先级
{
ss<< st.top()<< " ";//拼接c栈顶运算符
st.pop();
}
st.push(c);
}
}
else if(c =='(')
st.push(c);
else if(c == ')')
{
while(st.top() != '(')
{
ss<< " " << st.top();
st.pop();
}
st.pop();
}
else
ss<< c;
}
while(!st.empty())
{
ss << " "<< st.top();
st.pop();
}
return ss.str();
}