Problem Description
对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值。
Input
输入一个算术表达式的后缀式字符串,以‘#’作为结束标志。
Output
求该后缀式所对应的算术表达式的值,并输出之。
Example Input
59*684/-3*+#
Example Output
57
Hint
基本操作数都是一位正整数!
code:
#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OVERLOAD -2 #define ERROR 0 #define OK 1 typedef int ElemType; typedef struct { ElemType *base; ElemType *top; int stacksize; }Sqstack; void InitStack(Sqstack &s)//初始化栈 { s.base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(!s.base) { exit(OVERLOAD); } s.top = s.base; s.stacksize = STACK_INIT_SIZE; } int GetTop(Sqstack s, ElemType &e) { if(s.top == s.base) return ERROR; e = *(s.top-1); return OK; } void Push(Sqstack &s, ElemType e)//入栈 { if(s.top-s.base>=s.stacksize) { s.base = (ElemType*)realloc(s.base, (s.stacksize+STACKINCREMENT)*sizeof(ElemType)); if(!s.base) exit(OVERLOAD); s.top = s.base+s.stacksize; s.stacksize+=STACKINCREMENT; } *s.top++ = e; } int Pop(Sqstack &s, ElemType &e)//出栈,并将元素赋给e { if(s.top == s.base) return ERROR; e = *--s.top; return OK; } int main() { Sqstack li; InitStack(li); char s[10005]; int i = 0, e1, e2; scanf("%s", s); while(s[i]!='#') { if(s[i]>='0'&&s[i]<='9') { Push(li, s[i]-'0'); } else { if(s[i] == '+') { Pop(li, e1); Pop(li, e2); Push(li, e1+e2); } else if(s[i] == '-') { Pop(li, e1); Pop(li, e2); Push(li, e2-e1); } else if(s[i] == '*') { Pop(li, e1); Pop(li, e2); Push(li, e1*e2); } else if(s[i] == '/') { Pop(li, e1); Pop(li, e2); Push(li, e2/e1); } } i++; } GetTop(li, e1); printf("%d\n", e1); }