第一次遇见中后缀表达式是在牛客网上。当时师父和我讲了一下逻辑思路。算是懂了思路,但是没有去用代码实现。这段时间刚好数据结构上到栈和队列。老师的实验课就出了一道这样的题。
具体的题如下:
题目内容:
算术表达式有前缀表示法、中缀表示法、后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,
即二元运算符位于两个运算数之间。请设计程序将中缀表达式转换为后缀表达式。
中缀表示:2+3-4
后缀表示:2 3 + 4 -, 符号在两个运算数据的后面。后缀表达有很多好处,例如可以不要括号,见下面
的样例。
输入描述
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、/、(、)运算符,以#结束表达式
输出描述
在一行中给出转换后的表达式,要求不同对象(运算数、运算符号)之间以空格分隔
输入样例
2+3*(7-4)#
输出样例
2 3 7 4 - * +
中缀转后缀的思路大概如下。
以sample input为例。
对+ - 做优先级判断。对 * / 做优先级判断。
要注意的就是遇到括号的时候。需要做处理。
读取 ( 的时候直接入栈。
读取到 ) 则将之前入栈完的一次性输出前面入栈的元素
这里用了两个string,一个存中缀,一个存后缀,也就是结果。
代码如下:
for(int i=0;i<s.size()-1;i++){
if(is_number(s[i]))
s_back.push_back(s[i]);
else if(s[i]=='+'||s[i]=='-'){
while(1){
if(!stk.empty() && stk.top()!='('){
s_back.push_back(stk.top());
stk.pop();
}
else{
stk.push(s[i]);
break;
}
}
}
else if(s[i]=='*'||s[i]=='/'){
while(1){
if(!stk.empty() && (stk.top()=='*'|| stk.top()=='/')){
s_back.push_back(stk.top());
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());
stk.pop();
}
stk.pop(); //删除'('
break;
}
}
}
然后就是要把栈中剩余的运算符全部输出啦。
这里用了STL的stack。还用了string。
最近才刚开始接触STL和数据结构,所以在师父的引导下把这题做出来了。折腾了好久。。总而言之还是很开心。
有错误也欢迎指出哦~~