算术表达式的转换

算术表达式的转换

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

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

输入

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

输出

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

示例输入

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

示例输出

+*ab*-c/def
a*b+c-d/e*f
ab*cde/-f*+


前缀式可以由后缀式得到,将输入的数据逆序后,用后缀式的相似规则求出结果在逆序输出即可得到前缀式。

求前缀式的与后缀式的相似规则是,* / 不能弹出 * / ,+ -只能弹出 * / 。注意逆序后  “)”,要按照“(”处理,“(”,要按照“)”处理  中缀式 就直接把()去掉输出即可。



#include <stdio.h>

#include <stdlib.h>
#include <string.h>
typedef struct {
    char *base;
    char *top;
    int  Lsize;
}Sqstack;


Sqstack Create(Sqstack &s)
{
    s.base=(char  *)malloc(1010*sizeof(char));
    s.top=s.base;
    return s;
}


Sqstack push(Sqstack &s,char e){
    *s.top++=e;
}
char gettop(Sqstack &s)
{
    char e;
    e=*(s.top-1);
    return e;
}
char  pop(Sqstack &s){
    char a;
    if(s.top==s.base)return -1;
    s.top--;
    a=*s.top;
    if(a!='('&&a!=')')
    printf("%c",a);
    return a ;
    }
char  pop1(Sqstack &s){
    char a;
    if(s.top==s.base)return -1;
    s.top--;
    a=*s.top;
    return a ;
    }
int Empty(Sqstack &s){
    if(s.top==s.base) return 1;
    else return 0;
}
char clearstack(Sqstack &s){
    s.top=s.base;
}


char Conversion1(Sqstack &s,char b[],int l)
{
    int i;
    for(i=0;i<l-1;i++){
        if(b[i]>=97&&b[i]<=122)
            printf("%c",b[i]);
        else if(b[i]=='+'||b[i]=='-'){
            while(!Empty(s)&&gettop(s)!='('){
                pop(s);
            }
            push(s,b[i]);
        }
        else if(b[i]=='/'||b[i]=='*'){
            while(gettop(s)=='*'||gettop(s)=='/'&&!Empty(s))
                {
                pop(s);
            }
                push(s,b[i]);
        }
        else if(b[i]=='('){
                push(s,b[i]);
        }
        else if(b[i]==')'){
            while(gettop(s)!='('){
                pop(s);
            }
            pop(s);
        }
        while(i==l-2&&!Empty(s)){
            pop(s);
        }
    }
    clearstack(s);
}


char Conversion2(Sqstack &s,char b[],int l)
{
    Sqstack H;
    H=Create(H);
    int i;
    for(i=0;i<l-1;i++){
        if(b[i]>=97&&b[i]<=122)
          {
            push(H,b[i]);
          }
        else if(b[i]=='+'||b[i]=='-'){
            while(gettop(s)=='*'||gettop(s)=='/'){
                push(H,gettop(s));
                pop1(s);
            }
            push(s,b[i]);
        }
        else if(b[i]=='/'||b[i]=='*'){
                push(s,b[i]);
        }
        else if(b[i]=='('){
                    while(gettop(s)!='('){
                push(H,gettop(s));
                pop1(s);
            }
            pop1(s);;
        }
        else if(b[i]==')'){
                push(s,'(');
        }
        while(i==l-2&&!Empty(s)){
            push(H,gettop(s));
            pop1(s);
        }
    }
    while(!Empty(H)){
        gettop(H);
        pop(H);
    }
}


char Conversion3(char b[],int l)
{
    int i;
    for(i=0;i<l-1;i++){
        if(b[i]!='('&&b[i]!=')')
            printf("%c",b[i]);
    }
}


char Inverse(char c[],char d[],int l)
{
    int i,j;
    j=l-2;
    for(i=0;i<l-1;i++){
        d[j]=c[i];
        j--;
    }
    return *d;
}


int main()
{
    int i,j,len;
    char a[1001],b[1001];
    Sqstack S;
    S=Create(S);
    scanf("%s",&a);
    len=strlen(a);
    *b=Inverse(a,b,len);
    Conversion2(S,b,len);
    printf("\n");
    Conversion3(a,len);
    printf("\n");
    Conversion1(S,a,len);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值