后缀表达式求值

本文介绍了一种后缀表达式(逆波兰表示法)的计算方法,通过顺序扫描表达式,使用栈来处理操作数和运算符。在遇到运算符时,从栈中弹出两个操作数进行计算,并将结果压回栈中。文章提供了C语言实现的顺序栈结构,用于计算后缀表达式的结果,并给出具体示例代码。在主函数中,演示了如何处理一个后缀表达式字符串并计算最终结果。
摘要由CSDN通过智能技术生成

后缀表达式的求值

顺序扫描表达式中的每一项
若为操作数,则压入栈中;

若为运算符
则连续从栈中pop出两个操作数,
Y和X(后出栈op先出栈),并将计算结果重新压入栈中。

当表达式的所有项都扫描并处理完后,
栈顶存放的就是最后的计算结果

//后缀表达式的计算
/*顺序扫描表达式中的每一项
若为操作数,则压入栈中;

若为运算符
则连续从栈中pop出两个操作数,
Y和X(后出栈op先出栈),并将计算结果重新压入栈中。

当表达式的所有项都扫描并处理完后,
栈顶存放的就是最后的计算结果
*/


//栈的顺序存储结构,用静态数组实现
#include<stdio.h>
#include<string.h>
#define MaxSize 40//定义栈中元素的最大个数
#define ElemType int

typedef struct{
    ElemType data[MaxSize];//存放栈中的元素
    int top;//栈顶指针
}SqStack;//顺序栈

void InitStack(SqStack &s){
    s.top=-1;//初始化栈顶指针
}

bool StackEmpty(SqStack s){
    return s.top==-1;
}

bool Push(SqStack &s,ElemType x){
    if(s.top == MaxSize-1){
        printf("overflow\n");
        return false;
    }
    s.data[++s.top]=x;
    return true;
}

bool Pop(SqStack &s,ElemType &x){
    //先判断栈是否为空
    if(!StackEmpty(s)){
         x = s.data[s.top--];
        return true;
    }

}

bool GetTop(SqStack s,ElemType &x){
    //先判断栈是否为空
    if(!StackEmpty(s)){
        x = s.data[s.top];
        return true;
    }
}

bool DestroyStack(SqStack &s){
    s.top=-1;
}

bool PrintStack(SqStack s){
    int p=s.top;
    if(p==-1){
        printf("\n栈空\n");
        return false;
    }
    printf("Stack is :");
    while(p!=-1){
        printf("%d ",s.data[p--]);
    }
    printf("\n");
}

bool isDigit(char c){
    return (c>='0'&&c<='9');
}

bool isAlpha(char c){
    return ((c>='a'&& c<='z')||(c>='A'&&c<='Z'));
}

int CharToNum(char c){
    return (c-'0');
}
//输入后缀表达式字符串,和其长度,求最终结果
int SuffixToSum(char str[],int len){
    SqStack s;
    InitStack(s);
    char ch;
    int sum=0;
    for(int i=0;i<len;i++){
        ch=str[i];
        //如果此字符是0~9
        if(isDigit(ch)){
            sum = sum*10 + CharToNum(ch);
            if(str[i+1]==' '){//如果下一个为空格,则说明此数字结束
                Push(s,sum);//说明此操作数组合结束,则将操作数入栈
                sum=0;//并将sum置零
            }
        }
        else if(ch==' '){//为空格则继续下一个循环
            continue;
        }
        else{//说明是操作数
            int x,y,result;
            switch(ch){
            case '+':
                Pop(s,x);Pop(s,y);
                result=y+x;break;
            case '-':
                Pop(s,x);Pop(s,y);
                result=y-x;break;
            case '*':
                Pop(s,x);Pop(s,y);
                result=y*x;break;
            case '/':
                Pop(s,x);Pop(s,y);
                result=y/x;break;
            }
            Push(s,result);//将计算结果重新入栈
        }
    }
    int finalResult;
    Pop(s,finalResult);
    return finalResult;
}

int main(){
    char str0[30]="((15/(7-(1+1)))*3)-(4+(4+8))";
    char str1[50]="15 7 1 1 + - / 3 * 4 4 8 + + -";
    printf("后缀表达式为:");
    for(int i=0;i<strlen(str1);i++){
        printf("%c",str1[i]);
    }
    printf("\n其对应的中缀表达式为:");
    for(int i=0;i<strlen(str0);i++){
        printf("%c",str0[i]);
    }
    int x;
    x=SuffixToSum(str1,strlen(str1));
    printf("\n\n结果为:%d\n",x);
    return 0;
}

在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值