去年就做做过了中缀转变后缀的前缀的了,再敲一次的时候就只记得思想了,在逻辑上还是会犯错误。。。
看了下别人的博客,发现了一个更好的处理运算符优先级的方法。思路更明确!
同样是遍历一遍表达式
1,是运算数了就直接输出(也可以再开一个字符串来记录最后的结果,我是直接输出了)
2,是‘(’符号了直接压入运算符的栈中
3,是‘)‘符号了就一直出栈直到遇见’(“
4,只要栈中的字符优先级>=当前的运算符优先级就一直出栈,这个时候不要忘记了将现在的运算符压栈
5,遍历完毕后,将栈中的运算符全部输出
代码将栈中的提前放入了一个‘#’字符,很好的避免了向空栈中取栈顶元素的错误。不然每次取栈顶元素还要先判断是否是空栈这个方法很直接借鉴!
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
char a[1005];
int cmp(char s)
{
switch(s)
{
case '*':
case '/':return 2;
case '+':
case '-':return 1;
case '(':return 0;
default:return -1;
}
}
int main()
{
stack<char>op;
op.push('#');
int T;
scanf("%d",&T);
getchar();
while(T--)
{
gets(a);
int len,i;
len=strlen(a);
for(i=0;i<len;i++)
{
char str=a[i];
if(str>='0'&&str<='9')
{
printf("%c",str);
}
else if(str=='(')
{
op.push(str);
}
else if(str==')')
{
while(op.top()!='(')
{
char s=op.top();
printf("%c",s);
op.pop();
}
op.pop();
}
else
{
while(cmp(op.top())>=cmp(str))
{
char s=op.top();
printf("%c",s);
op.pop();
}
op.push(str);
}
}
while(op.top()!='#')
{
char s=op.top();
printf("%c",s);
op.pop();
}
printf("\n");
}
return 0;
}