数据结构实验之栈三:后缀式求值
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值。
输入
输入一个算术表达式的后缀式字符串,以‘#’作为结束标志。
输出
求该后缀式所对应的算术表达式的值,并输出之。
示例输入
59*684/-3*+#
示例输出
57
提示
基本操作数都是一位正整数!
#include<iostream>
#include<cstdlib>
#include<string>
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
using namespace std;
typedef struct
{
int *base; //在栈构造之前和销毁之后,base的值为NULL
int *top; //栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack;
SqStack S;
int InitStack(SqStack &s)//构造一个空栈
{
s.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int ));
if(!s.base) //存储分配失败
exit(0);
s.top=s.base;
s.stacksize = STACK_INIT_SIZE;
return 1;
}
int Push(SqStack &s,int e)//压栈,插入元素e为新的栈顶元素
{
if(s.top-s.base>s.stacksize) //栈满,追加存储空间
{
s.base=(int *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int ));
if(!s.base)//存储分配失败
exit(0);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return 1;
}
int Pop(SqStack &s,int &e)//出栈,若栈不空,删除栈顶元素,用e返回其值
{
if(s.top==s.base)
return 0;
e=*--s.top;
return 1;
}
int StackEmpty(SqStack s)//判空
{
if(s.base==s.top)
return true;
else
return false;
}
int GetTop(SqStack S,int &e)
{
if(S.base==S.top)
return 0;
e=*(S.top-1);
return 1;
}
int main()
{
int x,etop,epop;
int result;
int value1=0,value2=0;
string str;
cin>>str;
int i=0;
InitStack(S);
while(str[i]!='#')
{
if(str[i]>='0'&&str[i]<='9')
{
x=str[i]-'0';//将字符型转为整型
Push(S,x);
}
else if(!StackEmpty(S))
{
if(str[i]=='+')//作‘+’运算
{
Pop(S,epop);//弹出栈顶元素
value2=epop;//获取第一个值
Pop(S,epop);//再弹出栈顶元素
value1=epop;//获取第二个值
result=value1+value2;
Push(S,result);//结果进栈
}
if(str[i]=='-')
{
Pop(S,epop);
value2=epop;
Pop(S,epop);
value1=epop;
result=value1-value2;
Push(S,result);
}
if(str[i]=='*')
{
Pop(S,epop);
value2=epop;
Pop(S,epop);
value1=epop;
result=value1*value2;
Push(S,result);
}
if(str[i]=='/')
{
Pop(S,epop);
value2=epop;
Pop(S,epop);
value1=epop;
result=value1/value2;
Push(S,result);
}
}
else{}
i++;
}
GetTop(S,etop);//获取栈顶元素并输出结果
cout<<etop<<endl;
return 0;
}