栈的应用--算术表达式的求值(中缀转后缀然后计算后缀表达式的值)

结果图:
这里写图片描述

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef char ElType;
typedef int Status;
typedef struct StackNode{
    ElemType data;
    struct StackNode *next;
}StackNode,*LinkStack;
void InitStack(LinkStack &s){
    s=NULL;
}
bool StackEmpty(LinkStack &s){
    return (s==NULL);
}
Status PushStack(LinkStack &s,ElemType e){  //数字栈入栈
    LinkStack p=(LinkStack)malloc(sizeof(StackNode));
    p->data=e;
    p->next=s;
    s=p;
    return OK;
}
Status PopStack(LinkStack &s,ElemType *e){
    if(StackEmpty(s))
        return ERROR;
    LinkStack p=s;
    *e=p->data;
    s=s->next;
    free(p);
    return OK;
}

//字母栈
typedef struct StackNode_zm{
    ElType data;
    struct StackNode_zm *next;
}StackNode_zm,*LinkStack_zm;
void InitStack_zm(LinkStack_zm &s){
    s=NULL;
}
bool StackEmpty_zm(LinkStack_zm &s){
    return (s==NULL);
}
Status GetStack_zm(LinkStack_zm s,ElType *e){
    if(s==NULL)
        return ERROR;
    *e=s->data;
    return OK;
}
Status PushStack_zm(LinkStack_zm &s,ElType e){  //字母栈入栈
    LinkStack_zm p=(LinkStack_zm)malloc(sizeof(StackNode_zm));
    p->data=e;
    p->next=s;
    s=p;
    return OK;
}
Status PopStack_zm(LinkStack_zm &s,ElType *e){
    if(StackEmpty_zm(s))
        return ERROR;
    LinkStack_zm p=s;
    *e=p->data;
    s=s->next;
    free(p);
    return OK;
}


Status isdigit(char a){
    if(0<=(a-'0')&&(a-'0')<=9)
        return OK;
    else
        return ERROR;
}
ElemType Operate(ElemType x,char c,ElemType y){
    int result;
    switch(c){
        case '+':
            result=x+y;
            break;
        case '-':
            result=x-y;
            break;
        case '*':
            result=x*y;
            break;
        case '/':
            result=x/y;
            break;
    }
    return result;
}
ElemType postfix(char c[]){    //后缀求值
    LinkStack ss;
    InitStack(ss);
    int i=0;
    ElemType a,b,result;
    while(c[i]!='#'){
        if(isdigit(c[i]))
            PushStack(ss,(c[i]-'0'));
        else{
            PopStack(ss,&b);
            PopStack(ss,&a);
            result =Operate(a,c[i],b);
            PushStack(ss, result);
        }
        i++;
    }
    PopStack(ss,&result);
    return result;
}
int cmpStack_zm(char a,char b){   //符号比较
    switch(a){
        case '+':
            switch (b){
            case '+':
                return 1;
            case '-':
                return 1;
            case '*':
                return -1;
            case '/':
                return -1;
            case '(':
                return -1;
            case ')':
                return 1;
            case '#':
                return 1;
            }
            break;
        case '-':
            switch (b){
            case '+':
                return 1;
            case '-':
                return 1;
            case '*':
                return -1;
            case '/':
                return -1;
            case '(':
                return -1;
            case ')':
                return 1;
            case '#':
                return 1;
            }
            break;
        case '*':
            switch (b){
            case '+':
                return 1;
            case '-':
                return 1;
            case '*':
                return 1;
            case '/':
                return 1;
            case '(':
                return -1;
            case ')':
                return 1;
            case '#':
                return 1;
            }
            break;
        case '/':
            switch (b){
            case '+':
                return 1;
            case '-':
                return 1;
            case '*':
                return 1;
            case '/':
                return 1;
            case '(':
                return -1;
            case ')':
                return 1;
            case '#':
                return 1;
            }
            break;
        case '(':
            switch (b){
            case '+':
                return -1;
            case '-':
                return -1;
            case '*':
                return -1;
            case '/':
                return -1;
            case '(':
                return -1;
            case ')':
                return 0;
            }
            break;
        case ')':
            switch (b){
            case '+':
                return 1;
            case '-':
                return 1;
            case '*':
                return 1;
            case '/':
                return 1;
            case ')':
                return 1;
            case '#':
                return 1;
            }
            break;
        case '#':
            switch (b){
            case '+':
                return -1;
            case '-':
                return -1;
            case '*':
                return -1;
            case '/':
                return -1;
            case '(':
                return -1;
            case '#':
                return 0;
            }
            break;
    }
    exit(0);
}
void main()
{
    //char a[]={'8' , '3' , '5',  '+' , '5' , '6' , '2' , '/' , '-' , '*' , '-' , '#'};
    //char a[]={'3','5','2','-','*','#'};

    //printf("%d\n",popfix(a));

    LinkStack_zm l;
    InitStack_zm(l);
    char IPX[]={'8','-','(','3','+','5',')','*','(','5','-','6','/','2',')','#'};
    char PFX[20];
    int i=0,j=0;
    ElType c,t;
    while(IPX[i]){
        c=IPX[i];
        if(c=='#')
        {
            while(!StackEmpty_zm(l)){
                PopStack_zm(l,&t);
                PFX[j++]=t;
            }
            break;
        }
        switch(c){
            case '(':
                PushStack_zm(l,c);
                break;
            case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':
                PFX[j++]=c;
                break;
            case '+':case '-':case '*':case '/':
                GetStack_zm(l,&t);
                if(StackEmpty_zm(l)||cmpStack_zm(t,c)<0)
                    PushStack_zm(l,c);
                else{
                    while(cmpStack_zm(t,c)>=0)
                    {
                        PopStack_zm(l,&t);
                        PFX[j++]=t;
                        GetStack_zm(l,&t);
                    }
                    PushStack_zm(l,c);
                }
                break;
            case ')':
                GetStack_zm(l,&t);
                while(t!='('){
                    PopStack_zm(l,&t);
                    PFX[j++]=t;
                    GetStack_zm(l,&t);
                }
                PopStack_zm(l,&t);
                break;
        }
        i++;
    }
    PFX[j++]='#';
    PFX[j]='\0';
    i=0;
    while(PFX[i])
    {
        printf("%c",PFX[i]);
        i++;
    }
    printf("\n%d\n",postfix(PFX));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个问题是关于算数的,我可以回答。要将中缀算术表达式换为后缀表达式,可以使用来实现。具体步骤是: 1. 从左到右扫描中缀表达式的每个数字或符号。 2. 如果扫描到一个数字,则将其加入到最终的后缀表达式中。 3. 如果扫描到一个左括号,则将其压入中。 4. 如果扫描到一个右括号,则将中的元素弹出并加入到后缀表达式中,直到遇到左括号为止。注意:左右括号都不需要加入到后缀表达式中。 5. 如果扫描到一个运算符,则将其压入中。但是,在压入之前,需要将顶的运算符与当前运算符比较。如果顶的运算符优先级高于当前运算符,则将顶的运算符弹出并加入到后缀表达式中,直到顶的运算符优先级低于或等于当前运算符。 6. 如果表达式已经扫描完毕,则将中的所有元素依次弹出并加入到后缀表达式中。 最后得到的后缀表达式就是该中缀表达式的等价形式。然后可以使用来对该后缀表达式求值,具体步骤是: 1. 从左到右扫描后缀表达式的每个数字或符号。 2. 如果扫描到一个数字,则将其压入中。 3. 如果扫描到一个运算符,则从中弹出两个数字进行运算,并将运算结果压入中。 4. 当表达式扫描完毕时,中仅剩下一个数字,即为该后缀表达式。 希望这个回答可以帮到你!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值