今天学校推免机考最后一题是将仅包含+-*/四种操作以及括号的中缀表达式转换为后缀表达式,其中涉及的操作数均为一位非负整数。在学习数据结构的时候其实简单的学过,但是没有亲自动手实践。导致一共五道题两个小时,45分钟写完了前四个题,最后一个题一直没写出来。
回来后看了解析,发现非常的简单,自己当时的思路也只是有一点偏差。非常的懊悔。感觉还是基础不够扎实。有些代码只学习思路很快就会忘,还是要动手实践。
分析中缀表达式转换为后缀表达式过程,其实非常简单。只要知道思路实现非常的容易。
①遇到操作数时,直接放入后缀表达式中。
②遇到操作符时,与栈底的操作符比较(栈底不为空),如果优先级小于栈底,将栈底操作符加入后缀表达式并重复检查。最后将当前操作符压入栈底。
③遇到左括号时正常压入。
④遇到右括号时,将与左括号之间的所有操作符加入后缀表达式中。
C++代码如下:
#include<bits/stdc++.h>
using namespace std;
int degree(char c)
{
if(c == '(') return 0;
if(c == '+' || c == '-') return 1;
if(c == '*' || c == '/') return 2;
}
int main()
{
string res;
string s;
cin>>s;
stack<char> op;
for(int i = 0; i < s.size(); i++)
{
if(isdigit(s[i]))
{
res+=s[i];
}
else if(s[i] == '*' || s[i] == '/' || s[i] == '(')
{
op.push(s[i]);
}
else if(s[i] == ')')
{
while(!op.empty() && op.top()!='(')
{
res+=op.top();
op.pop();
}
op.pop();
}
else
{
while(!op.empty() && degree(s[i]) < degree(op.top()))
{
res+=op.top();
op.pop();
}
op.push(s[i]);
}
}
while(!op.empty())
{
res+=op.top();
op.pop();
}
cout<< res;
return 0;
}