其中遇到了很多问题,贴一下代码吧!
/*
中缀表达式转化规则:
从左到右遍历中缀表达式的每个数字和符号,
若是数字就输出,即成为后缀表达式的一部分;
若是符号,则判断其与栈顶符号的优先级,
是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,
并将当前符号进栈,一直到最终输出后缀表达式为止。
*/
#include <iostream>
#include <stack>
#include <stdio.h>
using namespace std;
int prior(char c) //数字越大,表示优先级越高;
{
if(c == '#')
return 1;
if(c == '(')
return 2;
//if(c == ')' || c == '(')
// return 2;
if(c == '+' || c == '-')
return 3;
if(c == '*' || c == '/')
return 4;
}
int main()
{
char c;
stack <char> op;
op.push('#'); //这样做可以方便后面的处理,不然对于判空时不是很好处理;
while(scanf("%c",&c),c)
{
if(c >= 'a'&& c <= 'z')
cout << c;
else if(c == ')')
{
while(op.top() != '(')
{
cout << op.top();
op.pop();
}
op.pop();
}
else if(c == '(')
op.push(c);
else if(c == '#') //遇到'#'后将栈中的元素全部输出;
{
while(op.top() != '#')
{
cout << op.top();
op.pop();
}
return 0;
}
else
{
while(prior(c) <= prior(op.top())) //若优先级低于栈顶符号,则栈顶元素出栈;反之,则入栈;
{
cout << op.top(); //首先输出栈顶元素,然后再弹出;
op.pop();
}
op.push(c);
}
}
return 0;
}
//从这个程序中遇到了很多问题,比如结束,如果是判断栈空,怎么解决不是因为刚刚开始就是空的,然后就结束呢?
//然后想到的方法就是先将'#'压入堆栈中,最后判断栈顶元素是不是'#'即可,最后再return 0,这样也让程序退出了,不会陷入死循环。
//还有就是对于括号的处理,调试了很多次,最后终于AC了,心情无比喜悦了!
转载于:https://blog.51cto.com/liu168ad/1391060