中缀表达式转换为后缀表达式
1000(ms)
10000(kb)
1754 / 4417
中缀表达式是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。利用栈结构,将中缀表达式转换为后缀表达式。(测试数据元素为单个字符)
输入
中缀表达式
输出
后缀表达式
样例输入
A+(B-C/D)*E
样例输出
ABCD/-E*+
#include<iostream> #include<stdio.h> using namespace std; int main() { int top=-1; char a[50];//数组模拟栈 char ch; while((ch=getchar())!='\n')//一个一个字符读入 { if('A'<=ch&&ch<='z') cout<<ch;//如果是字符直接输出。 else if(top==-1) a[++top]=ch;//如果栈为空直接将运算符进入 else if(ch=='(') a[++top]=ch; else if(ch==')') //考虑括号,括号会改变运算符的优先级 { while(a[top]!='(') { cout<<a[top--]; } top--; } else if(ch=='*'||ch=='/') //乘除法的优先级大于加减法 { if(a[top]=='+'||a[top]=='-'||a[top]=='(')//如果栈顶是加减法或是括号就进栈。 a[++top]=ch; else if(a[top]=='*'||a[top]=='/')//如果栈顶是乘除法,输出栈顶,再进栈。 { cout<<a[top--];a[++top]=ch; } } else if(ch=='+'||ch=='-')//加减法优先级较小 { if(a[top]=='(')//考虑栈顶是不是括号 a[++top]=ch; else if(a[top]=='+'||a[top]=='-')//栈顶是加减,就输出,再进栈 { cout<<a[top--]; a[++top]=ch; } else if(a[top]=='*'||a[top]=='/')//栈顶是乘法,就考虑栈顶的前一位是否为空 { cout<<a[top--];//先输出栈顶 if(top!=0) cout<<a[top--];//如果不是空就继续输出栈顶 a[++top]=ch;//再进栈 } } } while(top>=0) cout<<a[top--]; return 0; }
用栈:思路一样
#include<iostream> #include<cstdio> #include<stdlib.h> using namespace std; typedef struct { char data[105]; int top; }Sqlist; void push(char e,Sqlist *&l) { l->data[++l->top]=e; } void pop(Sqlist *&l) { if(l->data[l->top]=='(') l->top--; else cout<<l->data[l->top--]; } int main() { char ch; Sqlist *l; l->top=-1; while((ch=getchar())!='\n') { if('A'<=ch&&ch<='z') cout<<ch; else if(l->top==-1) push(ch,l); else if(ch=='(') push(ch,l); else if(ch==')') { while(l->data[l->top]!='(') { pop(l); } pop(l); } else if(ch=='*'||ch=='/') { if(l->data[l->top]=='+'||l->data[l->top]=='-'||l->data[l->top]=='(') push(ch,l); else if(l->data[l->top]=='*'||l->data[l->top]=='/') { pop(l); push(ch,l); } } else if(ch=='+'||ch=='-') { if(l->data[l->top]=='(') push(ch,l); else { pop(l); push(ch,l); } } } while(l->top!=-1) pop(l); return 0; }