#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node{
char a[100];
int top;
}stack;
int grade(char a){
if(a=='+'||a=='-')
return 0;
else if(a=='*'||a=='/')
return 1;
else return -1;//左右括号
}
int main(){
char s[50],ans[50];
scanf("%s",s);
stack.top=-1;
int i=0,j=0;
printf("%d\n",strlen(s));
while(i<strlen(s)){
printf("%d:%c %d***\n",i,s[i],stack.top);
char temp=s[i];
if(temp==' '){
i++;
continue;
}
else if(temp>='0'&&temp<='9')
ans[j++]=temp;
else if(temp=='(')
stack.a[++(stack.top)]=temp;
else if(temp==')'){
while(stack.a[stack.top]!='('){
ans[j++]=stack.a[stack.top--];
}
stack.top--;
}
else{
while(grade(temp)<=grade(stack.a[stack.top])&&stack.top!=-1)
ans[j++]=stack.a[stack.top--];
stack.a[++stack.top]=temp;
}
i++;
}
while(stack.top!=-1){
ans[j++]=stack.a[(stack.top)--];
}
printf("%s",ans);
return 0;
}
//2*(9+6/3-5)+4
①若遇到空格则认为是分隔符,不需处理;
②若遇到运算数,则直接输出;
③若是左括号,则将其压入堆栈中;
④若是右括号,表明括号内的中缀表达式已经扫描完毕,将栈顶的运算符弹出并输出,直到遇到左括号(左括号也出栈,但不输出);
⑤若遇到的是运算符,
若该运算符的优先级大于栈顶运算符的优先级时,则把它压栈;
若该运算符的优先级小于等于栈顶运算符时,将栈顶运算符弹出并输出,再比较新的栈顶运算符,按同样处理方法,直到该运算符大于栈顶运算符优先级为止,然后将该运算符压栈;
⑥若中缀表达式中的各对象处理完毕,则把堆栈中存留的运算符一并输出。
步骤 | 待处理表达式 | 堆栈状态 (底->顶) | 输出状态 |
1 | 2*(9+6/3-5)+4 |
|
|
2 | *(9+6/3-5)+4 |
| 2 |
3 | (9+6/3-5)+4 | * | 2 |
4 | 9+6/3-5)+4 | *( | 2 |
5 | +6/3-5)+4 | *( | 2 9 |
6 | 6/3-5)+4 | *( + | 2 9 |
7 | /3-5)+4 | *( + | 2 9 6 |
8 | 3-5)+4 | *( + / | 2 9 6 |
9 | -5)+4 | *( + / | 2 9 6 3 |
10 | 5)+4 | *( - | 2 9 6 3 / + |
11 | )+4 | *( - | 2 9 6 3 / + 5 |
12 | +4 | * | 2 9 6 3 / + 5 - |
13 | 4 | + | 2 9 6 3 / + 5 - * |
14 |
| + | 2 9 6 3 / + 5 - * 4 |
15 |
|
| 2 9 6 3 / + 5 - * 4 + |