算术表达式的转换 栈

来源:互联网 发布:淘宝店铺背景图片尺寸 编辑:程序博客网 时间:2024/05/19 05:06

题目描述

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

输入

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

输出

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

示例输入

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

示例输出

+*ab*-c/defa*b+c-d/e*fab*cde/-f*+
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<stack>using namespace std;int bijiao(char a,char b){    if(a=='*'||a=='/')        return 1;    else if((a=='+'||a=='-')&&(b=='+'||b=='-'))        return 1;    else        return 0;}int bijiao2(char a,char b){    if((a=='*'||a=='/')&&(b=='+'||b=='-'))        return 1;     else        return 0;}int main(){    char str[200000],str2[200000],str3[200000];    stack<char>q;    scanf("%s",str);    int len=strlen(str);    int k=0;    int j=len-1;    while(str[j]!='#')        j--;    for(int i=j-1; i>=0; i--)    {        str2[k++]=str[i];    }    str2[k++]='#';    str2[k]='\0';    len=strlen(str2);    j=0;    for(int i=0;i<len; i++)    {        if(str2[i]>='a'&&str2[i]<='z')        {            str3[j++]=str2[i];        }        else if(str2[i]=='*'||str2[i]=='/'||str2[i]=='+'||str2[i]=='-')        {            if(q.empty()||q.top()==')')                q.push(str2[i]);            else            {                if (bijiao2(q.top(),str2[i]))                {                    str3[j++]=q.top();                    q.pop();                    q.push(str2[i]);                }                else                {                    q.push(str2[i]);                }            }        }        else  if(str2[i]==')'||str2[i]=='(')        {            if(str2[i]==')')                q.push(str2[i]);            else if(str2[i]=='(')            {                while(q.top()!=')')                {                    str3[j++]=q.top();                    q.pop();                }                if(q.top()==')')                    q.pop();            }        }        else        {            while(!q.empty())            {                str3[j++]=q.top();                q.pop();            }        }        if(str2[i]=='#')            break;    }    for(int i=j-1; i>=0; i--)        cout<<str3[i];    cout<<endl;    for(int i=0; str[i]!='#'; i++)    {        if(str[i]!='('&&str[i]!=')')            cout<<str[i];    }    cout<<endl;    len=strlen(str);    while(!q.empty())        q.pop();    for(int i=0; i<len; i++)    {        if(str[i]>='a'&&str[i]<='z')        {            cout<<str[i];        }        else if(str[i]=='*'||str[i]=='/'||str[i]=='+'||str[i]=='-')        {            if(q.empty()||q.top()=='(')                q.push(str[i]);            else            {                if (bijiao(q.top(),str[i]))                {                    cout<<q.top();                    q.pop();                    q.push(str[i]);                }                else                {                    q.push(str[i]);                }            }        }        else  if(str[i]==')'||str[i]=='(')        {            if(str[i]=='(')                q.push(str[i]);            else if(str[i]==')')            {                while(!q.empty()&&q.top()!='(')                {                    cout<<q.top();                    q.pop();                }                if(q.top()=='(')                    q.pop();            }        }        else        {            while(!q.empty())            {                cout<<q.top();                q.pop();            }        }        if(str[i]=='#')            break;    }    cout<<endl;    return 0;}

唉!!坑爹啊,我竟然忘了在前缀的时候需要重新定义比较错了n遍,orz
0 0