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; }




posted @ 2018-08-15 22:29  小乔萌萌哒  阅读(232)  评论(0)    收藏  举报