sdut 2484 算术表达式的转换
算术表达式的转换
Problem Description
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
Input
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
Output
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
Sample Input
a*b+(c-d/e)*f#
Sample Output
+*ab*-c/def a*b+c-d/e*f ab*cde/-f*+
Hint
#include <bits/stdc++.h> using namespace std; stack<char>st2,st1; int main() { int i,len; char s[100]; cin>>s; while(!st1.empty())st1.pop(); while(!st2.empty())st2.pop(); len=strlen(s); /* 前缀是从后向前遍历,若为字母则进入一个储存的数组里(这里用了栈st1); 否则,若为‘)’则进栈st2,若为‘(’则将‘)’前面的元素进入st1,
若为其它的运算符时,
如果当前运算符优先级大于等于st2的栈顶元素则进入st2,否则进入st1; */ for(i=len-2; i>=0; i--) { if(s[i]<='z'&&s[i]>='a')st1.push(s[i]); else if(st2.empty())st2.push(s[i]); else if(s[i]=='*'||s[i]=='/')st2.push(s[i]);//乘除号大于等于其它运算符 else if(s[i]=='+'||s[i]=='-') { if(st2.top()==')')st2.push(s[i]); else if(st2.top()=='*'||st2.top()=='/') { st1.push(st2.top()); st2.pop(); st2.push(s[i]); } else if(st2.top()=='+'||st2.top()=='-')st2.push(s[i]); } else if(s[i]==')')st2.push(s[i]); else if(s[i]=='(') { while(!st2.empty()&&st2.top()!=')') { st1.push(st2.top()); st2.pop(); } if(!st2.empty()&&st2.top()==')')st2.pop(); } } while(!st2.empty()) { if(st2.top()!=')'&&st2.top()!='(') st1.push(st2.top()); st2.pop(); } while(!st1.empty()) { cout<<st1.top(); st1.pop(); } cout<<endl; /* 中序遍历把括号去掉即可 */ for(i=0; s[i]!='#'; i++) { if(s[i]!='('&&s[i]!=')') cout<<s[i]; } cout<<endl; /* 后续遍历为若是字母则输出,当为运算符或括号时: 若栈st2空或左括号时进栈,当不为空时, 若当前运算符优先级大于栈顶元素就进栈; 否则将栈顶元素出栈,并把当前元素入栈, 最后输出栈内剩余元素 */ while(!st2.empty())st2.pop(); for(i=0; s[i]!='#'; i++) { if(s[i]<='z'&&s[i]>='a')cout<<s[i]; else if(st2.empty())st2.push(s[i]); else if(s[i]=='*'||s[i]=='/') { if(st2.top()=='*'||st2.top()=='/') cout<<s[i]; else st2.push(s[i]); } else if(s[i]=='+'||s[i]=='-') { if(st2.top()=='(')st2.push(s[i]); else { cout<<st2.top(); st2.pop(); st2.push(s[i]); } } else if(s[i]=='(')st2.push(s[i]); else if(s[i]==')') { while(!st2.empty()&&st2.top()!='(') { cout<<st2.top(); st2.pop(); } if(!st2.empty()&&st2.top()=='(')st2.pop(); } } while(!st2.empty()) { cout<<st2.top(); st2.pop(); } cout<<endl; return 0; }

浙公网安备 33010602011771号