输入仅一行为中缀表达式,式中所有数字均为个位数,表达式长度小于1000。
输出一行,为后缀表达式,式中无空格。
输入样例:
2+4*8+(8*8+1)/3
输出样例:
248*+88*1+3/+
代码实现:书写过程时候容易把情况说漏,导致无限循环加段错误;
1.扫描到数字直接入栈2,栈2用来最后输出
2.扫描到操作符,如果是左括号直接入栈
如果是右括号,将栈1中操作符依次弹出放入栈2,直到左括号停止,记得把左括号删去;
如果是加或者减,弹出栈1顶部放入栈2直到遇到左括号停止再将当前符号放入栈1,不要删除左括号
如果是乘除,1.栈1顶是加或者减直接入栈1,
2.顶部是乘除则弹出顶部直到优先级更低的运算符或者左括号出现,然后停止弹出,再将当前运算符放入栈1顶部;
eq:有很多不同的版本,不同的要求,但是大致都是那个思路,注意一些细节
#include<stdio.h>
#define MAXSIZE 1000
void change()//中缀转后缀
{
char str[MAXSIZE+111];
scanf("%s",str);
char S1[MAXSIZE];
int top1=-1;
char S2[MAXSIZE];
int top2=-1;
int i=0;
while(str[i]!='\0')
{
if('0'<=str[i]&&str[i]<='9')
//扫描到数字 直接入栈2
{
++top2;
S2[top2]=str[i];
i++;
}
else if(str[i]==')')
//扫描到')' 从栈1出栈元素直至'('
{
while(S1[top1]!='(')
{
++top2;
S2[top2]=S1[top1];
top1--;
}
--top1;//将左括号扔掉
i++;
}
else if(str[i]=='+'||str[i]=='-')//扫描到操作符
{
if(top1==-1)
//操作数栈为空或当前大于栈顶或栈顶元素为左括号,直接入栈
{
++top1;
S1[top1]=str[i];
i++;
}else{
do{
if('('==S1[top1])
{
break;
}else
{
top2++;
S2[top2] = S1[top1];
top1--;
}
}while(top1!=-1&&S1[top1]!='(');
top1++;
S1[top1] = str[i];
i++;
}
}
else if( '*'==str[i] || '/'==str[i])
{
//Push(&s, c);
if(top1==-1)
//操作数栈为空或当前大于栈顶或栈顶元素为左括号,直接入栈
{
++top1;
S1[top1]=str[i];
i++;
}else{
do{
if('('==S1[top1]||S1[top1]=='+'||S1[top1]=='-')
{
top1++;
S1[top1] = str[i];
i++;
break;
}else
{
top2++;
S2[top2] = S1[top1];
top1--;
}
}while(top1!=-1&&S1[top1]!='(');
}
}else if(str[i]=='(')
{
top1++;
S1[top1] = str[i];
i++;
}
}
while( top1!=-1 )
{
top2++;
S2[top2] = S1[top1];
top1--;
}
for(int j = 0;j<=top2;j++)
printf("%c",S2[j]);
printf("\n");
}
int main()
{
change();
return 0;
}