后缀表达式求值

题目描述

为了便于处理表达式,常常将普通表达式(称为中缀表示)转换为后缀{运算符在后,如X/Y写为XY/表达式。在这样的表示中可以不用括号即可确定求值的顺序,如:(P+Q)*(R-S) → PQ+RS-*。后缀表达式的处理过程如下:扫描后缀表达式,凡遇操作数则将之压进堆栈,遇运算符则从堆栈中弹出两个操作数进行该运算,将运算结果压栈,然后继续扫描,直到后缀表达式被扫描完毕为止,此时栈底元素即为该后缀表达式的值。

输入

输入一行表示后缀表达式,数与数之间一定有空格隔开(可能不只一个空格),最后输入@表示输入结束。
数据保证每一步的计算结果均为不超过100000的整数。

输出

输出一个整数,表示该表达式的值.

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<stdio.h>
#include<string.h>
using namespace std;
  
//顺序栈定义
#define OK 1
#define ERROR 0
#define OVERFLOW - 2
#define MAXSIZE  100 //顺序栈存储空间的初始分配量
typedef int Status;
typedef int SElemType;
  
typedef struct {
   SElemType *base;//栈底指针
   SElemType *top;//栈顶指针
   int stacksize;//栈可用的最大容量
} SqStack;
  
//算法3.1 顺序栈的初始化
Status InitStack(SqStack &s)
{
   //构造一个空栈S
   s.base = new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
   if(!s.base)
      exit(OVERFLOW); //存储分配失败
   s.top = s.base; //top初始为base,空栈
   s.stacksize = MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
   return OK;
}
  
void DestroyStack(SqStack &s)
{
   /* 销毁栈S,S不再存在 */
   delete []s.base;
   s.base = s.top = NULL;
   s.stacksize = MAXSIZE;
}
  
//算法3.2 顺序栈的入栈
Status Push(SqStack &s, int x)
{
   /****在此下面完成代码***************/
    if((s.top-s.base)==s.stacksize)return ERROR;
    *s.top=x;
    s.top++;
    return OK;
  
   /***********************************/
}
  
//算法3.3 顺序栈的出栈
int Pop(SqStack &s)
{
    /****在此下面完成代码***************/
    int x;
    if(s.base==s.top)return ERROR;
    s.top--;
    x=*s.top;
    return x;
   /***********************************/
}
  
void PrintStack(SqStack s)
{
   for(SElemType *top = s.top - 1; top >= s.base; top--) {
      cout << (*top);
      if(top != s.base)
         cout << ' ';
   }
   cout << endl;
}
  
int main()
{
   SqStack s;
   char op[10];
   int x,y,temp,sum,len,i;
   InitStack(s);
   while(scanf("%s",op)&&strcmp(op,"@")) 
   {
      //遇到空格再输入进行覆盖
      if(!strcmp(op," "))
      {
        scanf("%s",op);
      }
      //不是运算符就入栈
      else if(strcmp(op,"/")&&strcmp(op,"*")&&strcmp(op,"+")&&strcmp(op,"-"))
      {
        temp=1,sum=0;
        len=strlen(op);
        for(i=len-1;i>=0;i--)
        {
            sum=sum+(op[i]-'0')*temp;
            temp*=10;
          }
        Push(s,sum);
      }
      else if(!strcmp(op,"+"))
      {
        x=Pop(s);
        y=Pop(s);
        Push(s,y+x);
      }
      else if(!strcmp(op,"-"))
      {
        x=Pop(s);
        y=Pop(s);
        Push(s,y-x);
      }
      else if(!strcmp(op,"/"))
      {
        x=Pop(s);
        y=Pop(s);
        Push(s,y/x);
      }
      else if(!strcmp(op,"*"))
      {
        x=Pop(s);
        y=Pop(s);
        Push(s,y*x);
      }
   }
   PrintStack(s);
   DestroyStack(s);
   return 0;
}

样例输入 Copy

14  3 20 5 / * 8 - + @

样例输出 Copy

18
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值