算术表达式的转换

来源:互联网 发布:外商投资网络支付机构 编辑:程序博客网 时间:2024/04/26 10:18

算术表达式的转换

Time Limit: 1000MS Memory Limit: 65536KB

Problem Description

小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
   因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。

Input

 输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)

Output

 输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。

Example Input

a*b+(c-d/e)*f#

Example Output

+*ab*-c/defa*b+c-d/e*fab*cde/-f*+
    我用到的是类和栈,主要是求前缀和后缀,前缀是倒着往前求,后缀是正着往后求,两者还有个不同是,前缀栈顶元素的优先级是大于要进栈的运算符的优先级,而后缀是大于等于要紧栈的运算符的优先级的。
#include<iostream>#include<string>#include<cstring>#include<string.h>#include<cstdio>#include<stdlib.h>using namespace std;const int maxsize=100;char ch1[100];char ch2[100];char ch3[100];
//---------------------------------------------------------------------------------------------------------------------class Stack{    char StackList[maxsize];int top;public:Stack();bool isFull();bool isEmpty();void Push(char e);char Pop();    char  GetPop();void Pre(char a[]);//前缀void In(char a[]);//中缀void Pro(char a[]);//后缀int Compare(char m);void Clear();};//--------------------------------------------------------------------------------------------------------------Stack::Stack(){    top=-1;}bool Stack::isEmpty(){   if(top==-1)  return true;   else  return false;}bool Stack::isFull(){    if(top==maxsize-1)  return true;else return false;}void Stack::Push(char e){    if(isFull())  exit(0);StackList[++top]=e;}char Stack::Pop(){    if(isEmpty())   exit(0);return StackList[top--];}
//---------------------------------------------------------------------------------------------------------------------char Stack::GetPop(){     //if(isEmpty())  exit(0); return StackList[top];}
//-----------------------------------------------------------------------------------------------------------------int Stack::Compare(char m){    switch(m){case'(':case')':     return 1;case'+':case'-':    return 2;case'*':case'/':    return 3;default:    return 0;}}
//----------------------------------------------------------------------------------------------------------------------void Stack::Clear(){    top=-1;}
//----------------前缀-------------------------------------------------------------------------------------------------void Stack::Pre(char a[]){int j=0;int len=strlen(a);for(int i=len-2;i>=0;i--){        switch(a[i]) { case'+': case'*': case'/': case'-': {     if(Compare(a[i])<Compare(GetPop())) while(Compare(a[i])<Compare(GetPop()))    ch1[j++]=Pop(); Push(a[i]); break; } case')': {      Push(a[i]);  break; } case'(': {      while(GetPop()!=')')  ch1[j++]=Pop();  Pop();  break; } default: {     ch1[j++]=a[i]; break; } }}while(GetPop()!='#')ch1[j++]=Pop();ch1[j]='\0';}
//--------------中缀-------------------------------------------------------------------------------------------------void Stack::In(char a[]){int j=0;for(int i=0;a[i]!='#';i++)    if(a[i]!='('&&a[i]!=')')ch2[j++]=a[i];ch2[j]='\0';}
//-----------后缀---------------------------------------------------------------------------------------------------void Stack::Pro(char a[]){int j=0;for(int i=0;a[i]!='#';i++){     switch(a[i]) {    case'+':    case'-':    case'*':    case'/': {      if(Compare(a[i])<=Compare(GetPop()))  while(Compare(a[i])<=Compare(GetPop()))  ch3[j++]=Pop();  Push(a[i]);  break; } case'(': {     Push(a[i]); break; } case')': {     while(GetPop()!='(')      ch3[j++]=Pop(); Pop(); break; } default: {     ch3[j++]=a[i]; break; } }}while(GetPop()!='#')ch3[j++]=Pop();ch3[j]='\0';}
//-----------------------------------------------------------------------------------------------------------------------int main(){   char a[100];   cin>>a;   Stack s;   Stack();   s.Push('#');   s.Pre(a);   s.In(a);   s.Pro(a);   int len=strlen(ch1);   for(int j=len-1;j>=0;j--)   cout<<ch1[j];   cout<<endl;   string c=ch2;   cout<<c<<endl;   c=ch3;   cout<<c<<endl;   s.Clear();   return 0;   }