算术表达式的转换

来源:互联网 发布:怎样安装电脑软件 编辑:程序博客网 时间:2024/04/29 20:34


题目描述

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

输入

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

输出

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

示例输入

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

示例输出

+*ab*-c/defa*b+c-d/e*fab*cde/-f*+

#include <stdio.h>#include <algorithm>#include <stdlib.h>#include <string.h>#include <stack>using namespace std;char a[150];int len,cnt;void solve(char *n,int f)            //标记变量f来记录是求前缀式还是后缀式;前缀式与后缀式有一点不同:对于前缀式,栈顶的符号优先级要大于即将要放入栈的符号的优先级,然后输出栈顶符号‘*’或‘/’,然后再将当前符号放入栈内;而对于后缀式,栈顶的符号优先级要大于等于当前符号的优先级,然后将栈顶符号‘*’或‘/’或‘+’或‘-’输出,然后再讲当前符号放入栈内。{    memset(a,0,sizeof(a));    stack<char>sl;    cnt=0;    for(int i=0; i<len; i++)    {        if(n[i]<='z'&&n[i]>='a')            a[cnt++]=n[i];        else if(n[i]=='(')            sl.push(n[i]);        else if(n[i]==')')        {            while(sl.top()!='('&&!sl.empty())            {                a[cnt++]=sl.top();                sl.pop();            }            sl.pop();        }        else if(n[i]=='+'||n[i]=='-')        {            if(f)            {                while(!sl.empty()&&sl.top()!='('&&(sl.top()=='*'||sl.top()=='/'))                {                    a[cnt++]=sl.top();                    sl.pop();                }            }            else                while(!sl.empty()&&sl.top()!='(')                {                    a[cnt++]=sl.top();                    sl.pop();                }            sl.push(n[i]);        }        else if(n[i]=='*'||n[i]=='/')        {            while(!sl.empty()&&sl.top()!='('&&(sl.top()=='*'||sl.top()=='/'))            {                a[cnt++]=sl.top();                sl.pop();            }            sl.push(n[i]);        }    }    while(!sl.empty())    {        a[cnt++]=sl.top();        sl.pop();    }}int main(){    char st[150],sa[150];    memset(st,0,sizeof(st));         //清除原字符串    memset(a,0,sizeof(a));           //清除经转换后的字符串    memset(sa,0,sizeof(sa));         //清除倒置的字符串,用以转换前缀式    while(~scanf("%s",st))    {        len=strlen(st)-1;            //把字符“#”去掉        int i,j;        for(i=0,j=len-1; i<len; i++,j--)        {            if(st[j]=='(')                sa[i]=')';            else if(st[j]==')')                sa[i]='(';            else                sa[i]=st[j];        }        solve(sa,1);                 //得到前缀式        for(i=cnt-1; i>=0; i--)            printf("%c",a[i]);        printf("\n");        for(i=0; i<len; i++)         //对于中缀式记得把括号去掉        {            if(st[i]!='('&&st[i]!=')')                printf("%c",st[i]);        }        printf("\n");        solve(st,0);                 //得到后缀式        for(i=0; i<cnt; i++)            printf("%c",a[i]);        printf("\n");    }    return 0;}

 


0 0
原创粉丝点击