数据结构实验之栈与队列三:后缀式求值
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值。
Input
输入一个算术表达式的后缀式字符串,以‘#’作为结束标志。
Output
求该后缀式所对应的算术表达式的值,并输出之。
Example Input
59*684/-3*+#
Example Output
57
Hint
基本操作数都是一位正整数!
遇到字母入栈,遇到运算符的时候将栈顶两个元素作运算,元素出栈,运算结果入栈。
#include <stdio.h>
#include <stdlib.h>
typedef int elemtype;
typedef int status;
#define MAXSIZE 100
#define OVERFLOW -2
#define another 50
#define true 1
#define false 0
typedef struct {
elemtype *base;
elemtype *top;
int stacksize;
}Sqstack;
status isEmpty(Sqstack &S){
if(S.top == S.base)
return true;
else
return false;
}
void initStack(Sqstack &S){
S.base = new elemtype[MAXSIZE];
S.top = S.base;
S.stacksize = MAXSIZE;
}
elemtype getTop(Sqstack &S){
if(S.base == S.top)
return false;
else
return *(S.top-1);
}
void Push(Sqstack &S, elemtype e){ //压栈
if(S.top-S.base >= S.stacksize){
S.base = (elemtype *)realloc(S.base,(another+S.stacksize)*sizeof(elemtype));
S.top = S.base + S.stacksize;
S.stacksize += another
;
}
*S.top++ = e;
}
int Pop(Sqstack &S, elemtype &e){
if(S.top == S.base) return false;
return e = * --S.top;
}
int main(){
int n, r;
Sqstack S;
initStack(S);
char str[100];
scanf("%s", str);
for(int i = 0; str[i] != '#'; i++){
if(str[i]>='0' && str[i] <= '9'){
Push(S, str[i]-'0');
}
else if(str[i] == '*'){
int a, b;
Pop(S, a);
Pop(S, b);
Push(S, a*b);
}
else if(str[i] == '/'){
int a, b;
Pop(S, a);
Pop(S, b);
Push(S, b/a);
}
else if(str[i] == '+'){
int a, b;
Pop(S, a);
Pop(S, b);
Push(S, a+b);
}
else if(str[i] == '-'){
int a, b;
Pop(S, a);
Pop(S, b);
Push(S, b-a);
}
}
printf("%d\n", getTop(S));
return 0;
}