利用栈的特性,可以把一些即用即销的数据保存在栈中
定义一个结构体,包含两个部分,一个部分表示是数据还是符号。另一个部分保存内容。
typedef enum RPN_TYPE
{
OP_NUM,
OP_SYMBOL,
OP_ADD, // +
OP_SUB, // -
OP_MUL, // *
OP_DIV, // /
}RPN_TYPE;
typedef struct Cell
{
RPN_TYPE _type;
int value;
}Cell;
实现部分
int CountRPN(Cell* rpn, size_t n)
{
assert(rpn);
size_t i = 0;
Stack s;
StackInit(&s);
for (i = 0; i < n; i++)
{
if (rpn[i]._type == OP_NUM)
{
StackPush(&s, rpn[i].value);
}
else
{
int left, right;
right = StackTop(&s);
StackPop(&s);
left = StackTop(&s);
StackPop(&s);
switch (rpn[i].value)
{
case OP_ADD:
StackPush(&s, left + right);
break;
case OP_SUB:
StackPush(&s, left - right);
break;
case OP_MUL:
StackPush(&s, left * right);
break;
case OP_DIV:
StackPush(&s, left / right);
break;
default:
break;
assert(0);
}
}
}
return StackTop(&s);
}
调试部分
void TestRPN()
{
Cell rpn[] =
{
{ OP_NUM, 12 },
{ OP_NUM, 3 },
{ OP_NUM, 4 },
{ OP_SYMBOL, OP_ADD }, //+
{ OP_SYMBOL, OP_MUL }, //*
{ OP_NUM, 6 },
{ OP_SYMBOL, OP_SUB }, //-
{ OP_NUM, 8 },
{ OP_NUM, 2 },
{ OP_SYMBOL, OP_DIV }, // /
{ OP_SYMBOL, OP_ADD }, //+
};
printf("运算结果:%d\n", CountRPN(rpn, sizeof(rpn) / sizeof(Cell)));
}