问题:
逆波兰式表达方式:先操作数,后操作符
我们用栈来实现:操作数在操作符的前面,按顺序遍历,遇到操作数进栈,遇到操作符让操作数出栈并进行运算,然后将运算结果进栈(过程如图所示)
遇到第一个操作符“+”的时候,由于需要两个操作数,所以出栈两次,执行加法算法,结果是7,7进栈,后面的以此类推
- 先来定义结构体
typedef enum {
OPERAND, // 操作数类型
OPERATOR // 操作符类型
} Type;
typedef enum {
ADD, SUB, MUL, DIV
} Operator;
typedef struct {
Type type;
int operand; // 操作数
Operator operator; // 操作符
} Element;
- 具体代码实现
int Run(Operator operator, int op1, int op2)
{
int c = 0;
switch (operator)
{
case ADD:
c = a + b;
break;
case SUB:
c = a - b;
break;
case MUL:
c = a * b;
break;
case DIV:
c = a / b;
break;
default:
// 不应该出现
assert(0);
}
}
int ReversePolishNotion(Element expression[], int size)
{
Stack stack;
StackInit(&stack);
int op1,op2;
int result;
for(int i = 0; i < size; i++)
{
Element e = expression[i];
switch(e.type)
{
case OPERAND:
StackPush(&stack, e.operand);
break;
case OPERATOR:
op1 = StackTop(&stack); StackPop(&stack);
op2 = StackTop(&stack); StackPop(&stack);
result = Run(e.operator, op1, op2);
StackPush(&stack, result);
break;
default:
assert(0);
}
}
assert(StackSize(&stack) == 1);
result = StackTop(&stack);
return result;
}