习题3.11 表达式转换 (25分)

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:

输入在一行中给出不含空格的中缀表达式,可包含+-*\以及左右括号(),表达式不超过20个字符。

输出格式:

在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

输入样例:

2+3*(7-4)+8/4

输出样例:

2 3 7 4 - * + 8 4 / +

#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>

 

#define ERROR - 1

#define MAXLENTH 100

#define maxsize 20

typedef char ElementType;

 

typedef struct snode* PtrToSnode;

struct snode

{

    ElementType data;

    PtrToSnode next;    

};

 

typedef PtrToSnode mystack;

 

bool isEmpty(mystack ms);

mystack create();

bool pushdata(mystack ms, ElementType X);

ElementType popdata(mystack ms);

 

int OprToDig(char ch);

 

int OprToDig(char ch)

{

    int val;

    switch (ch)

    {

        case '+':

            val = 1;

            break;

        case '-':

            val = 1;

            break;

        case '*':

            val = 2;

            break;

        case '/':

            val = 2;

            break;

        case '(':

            val = 0;

            break;

        case ')':

            val = 0;

            break;

        default:

            printf("%c is invalid Charn", ch);

            break;

    }

    return val;

}


 

mystack create()

{

    mystack ms = (mystack)malloc(sizeof(struct snode));

    ms->next = NULL;

    return ms;

        

}

 

bool isEmpty(mystack ms)

{

    return (ms->next == NULL);

}

 

bool isFull(mystack ms)

{

    return (ms->next == maxsize - 1);

}

 

bool pushdata(mystack ms,ElementType x)

{

    bool rlt = false;

    PtrToSnode tmpcell = (PtrToSnode)malloc(sizeof(struct snode));

    tmpcell->data = x;

    tmpcell->next = ms->next;

    ms->next = tmpcell;

    rlt = true;

    return rlt;

}

 

ElementType popdata(mystack ms)

{

    if(isEmpty(ms))

    {

        printf("empty stcak.\n");

        return ERROR;

    }

    else

    {

        ElementType rlt = ms->next->data;

        PtrToSnode tmpcell;

        tmpcell = ms->next;

        ms->next = tmpcell->next;

        free(tmpcell);

        return rlt;

    }

}

 

int main()

{

    bool flag = false;

    bool isFirst = true;

    mystack stk = create();

    char exrn[MAXLENTH];

    gets(exrn);

    

    int i = 0;

    while(exrn[i]!='\0')

    {

        if(((i==0) && (exrn[i]=='-'||exrn[i]=='+')) || ((exrn[i]>='0' && exrn[i]<='9')||exrn[i]=='.') || ((exrn[i]=='-'||exrn[i]=='+')&&exrn[i-1]=='('))

        {

            if(flag && !isFirst)

            {

                printf(" ");

                flag = false;

            }

                isFirst = false;

            if(exrn[i] == '+')

            {

                i++;

            }

            printf("%c", exrn[i]);

            i++;

            while((exrn[i]>='0' && exrn[i] <= '9')|| exrn[i] == '.')

            {

                printf("%c",exrn[i++]);

            }

            continue;

        }

        else

        {

            flag = true;

            if(exrn[i] == '(')

            {

                pushdata(stk,exrn[i]);

            }

            else if(exrn[i] == ')')

            {

                ElementType ch;

                while((ch = popdata(stk))!='(')

                {

                    printf(" %c",ch);

                }

            }

            else

            {

                if(isEmpty(stk))

                {

                    pushdata(stk,exrn[i]);

                }

            

                else

                {

                    if( OprToDig(exrn[i]) > OprToDig(stk->next->data))

                    {

                        pushdata(stk,exrn[i]);

                    }

                    else if(OprToDig(exrn[i]) <= OprToDig(stk->next->data))

                    {

                        do

                        {

                            printf(" %c", popdata(stk));

                        }

                        while( (stk->next!=NULL)&&(OprToDig(exrn[i]) <= OprToDig(stk->next->data)) );

                        pushdata(stk,exrn[i]);

                    }

                }

                

            }

        }

        i++;

 

    }

    while(!isEmpty(stk))

    {

        printf(" %c", popdata(stk));

    }

    

    system("pause");

    

}





 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值