题目简述:
解析:
本题重点在于对题目的分析和想到解决方法。
容易想到,可以转换成对二叉树的存储,原式是中序遍历,转换成后序遍历,输出节点即可。
难点在于怎么处理表达式和括号的优先级问题。
首先,对于括号(),(*、/)号和(+、-)号分别赋予3、2和1的优先级。遍历字符串,
(1)如果遇到字母,则直接输出;
(2)如果遇到运算符,判断其与当前栈顶符号的优先级:
——读入的新运算符优先级高就继续将运算符入栈;
——反之输出栈内的运算符,直到遇到一个比自己优先级低的或者栈已经为空(即大于等于自己优先级的运算符都要输出)就把自己压进栈,
——同时,如果遇到右括号”)“,就把栈内运算符按顺序输出直到遇到(,把(出栈后停止。
(3)读完所有字符串后,将栈内运算符全出栈即可。
重点:
(1)了解解题思路;
(2)理解对栈的操作;
代码:
#include <iostream>
#include<stack>
#include<string>
using namespace std;
void InitStack(stack<char>stk)
{
while(!stk.empty())
stk.pop();
}
int Prior(char ch)
{
if(ch=='(')
return 2;
else if(ch=='*'||ch=='/')
return 1;
else
return 0;
}
void Reverse_Polish(stack<char>stk,string expr,int len)
{
for(int i=0;i<len;i++)
{
//cout<<"当前判断的字符是:";
//cout<<expr[i]<<endl;
if(expr[i]<='z'&&expr[i]>='a')
cout<<expr[i];
else
{
if(expr[i]==')')
{
//一直出栈直到遇到(
while(stk.top()!='(')
{
cout<<stk.top();
stk.pop();
}
stk.pop();//将(也出栈
}
else
{
if(stk.empty()||Prior(expr[i])>Prior(stk.top())||stk.top()=='(')
{
//cout<<"该字符入栈"<<endl;
stk.push(expr[i]);
}
else
{
//当前读入优先级<=栈顶,则一直弹出,直到遇到大于自己的或栈已经为空
//最后把自己放进去
while(1)
{
if(!stk.empty()&&Prior(stk.top())>=Prior(expr[i]))
{
cout<<stk.top();
stk.pop();
}
else
{
//直到遇到比自己优先级低的,把自己放进去
stk.push(expr[i]);
break;
}
}
}
}
}
}
while(!stk.empty())
{
cout<<stk.top();
stk.pop();
}
}
int main()
{
stack<char>stk;
string expr;
cin>>expr;
int len=expr.size();
//初始化栈
InitStack(stk);
Reverse_Polish(stk,expr,len);
return 0;
}