利用值栈对逆波兰表达式进行求值。逆波兰表达式从键盘输入,其中的运算符仅包含加、减、乘、除4种运算,表达式中的数都是十进制数,用换行符结束输入。由于逆波兰表达式的长度不限,所以值栈要用后进先出链表实现。
测试输入:
2 1 + 3 *
预期输出:
9
解释:
该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
测试输入:
4 13 5 / +
预期输出:
6
解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 199
struct SNode {
int Data[MaxSize];
int Top;
};
typedef struct SNode* Stack;
Stack CreateStack() {
Stack p;
p = (Stack)malloc(sizeof(struct SNode));
p->Top = -1;
return p;
}
void Push(Stack S, int x) {
if (S->Top == MaxSize) {
printf("Stack Full\n");
}
else {
S->Data[++S->Top] = x;
}
}
int Pop(Stack S) {
if (S->Top == -1) {
printf("Stack is Empty!\n");
}
else {
int t;
t = S->Data[S->Top];
S->Top--;
return t;
}
}
int main() {
Stack S;
S = CreateStack();
char ch;
ch = getchar();
int a, b, an, t;
while (ch != EOF) {
if (ch >= '0' && ch <= '9') {
Push(S, ch - '0');
ch = getchar();
while (ch >= '0' && ch <= '9') {
t = Pop(S);
Push(S, t * 10 + ch - '0');
ch = getchar();
}
}
else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
a = Pop(S);
b = Pop(S);
switch (ch) {
case '+':an = b + a; break;
case '-':an = b - a; break;
case '*':an = b * a; break;
case '/':an = b / a; break;
}
Push(S, an);
}
else if (ch == '\n') {
break;
}
ch = getchar();
}
printf("%d", Pop(S));
}