题目描述
为了便于处理表达式,常常将普通表达式(称为中缀表示)转换为后缀{运算符在后,如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