//寻找空格
int FindSpace(char *rpn, int pos, int len)
{
for (; pos < len; ++pos)
{
if (' ' == rpn[pos])
return pos;
}
return -1;
}
//逆波兰表达式
int ExpressionRPN(char *rpn, int len)
{
int i = 0;
//int num = 0;
int rightnum = 0;
int leftnum = 0;
Stack s;
StackInit(&s);
assert(rpn);
for (i = 0; i < len; ++i)
{
if (rpn[i] >= '0' && rpn[i] <= '9')
{
StackPush(&s, atoi(&rpn[i]));
i = FindSpace(rpn, i, len);
//continue;
}
if (('+' == rpn[i]) || ('-' == rpn[i]) || ('*' == rpn[i]) || ('/' == rpn[i]))
{
switch (rpn[i])
{
case '+':
//先取右操作数,再出栈
rightnum = StackTop(&s);
StackPop(&s);
//再取左操作数,再出栈
leftnum = StackTop(&s);
StackPop(&s);
//将计算结果入栈
StackPush(&s, leftnum + rightnum);
break;
case '-':
//先取右操作数,再出栈
rightnum = StackTop(&s);
StackPop(&s);
//再取左操作数,再出栈
leftnum = StackTop(&s);
StackPop(&s);
//将计算结果入栈
StackPush(&s, leftnum - rightnum);
break;
case '*':
//先取右操作数,再出栈
rightnum = StackTop(&s);
StackPop(&s);
//再取左操作数,再出栈
leftnum = StackTop(&s);
StackPop(&s);
//将计算结果入栈
StackPush(&s, leftnum * rightnum);
break;
case '/':
//先取右操作数,再出栈
rightnum = StackTop(&s);
StackPop(&s);
//再取左操作数,再出栈
leftnum = StackTop(&s);
StackPop(&s);
//将计算结果入栈
StackPush(&s, leftnum / rightnum);
break;
default:
break;
}
}
}
//计算完毕,结果在栈里
return StackTop(&s);
}
test.c
//测试逆波兰表达式
test2()
{
char rpn[] = "12 3 4 + * 6 - 8 2 / +";
int ret = ExpressionRPN(rpn, strlen(rpn));
printf("表达式结果为:%d\n", ret);
}
int main()
{
//test1();
test2();
//char c[] = "12 3 4";
//printf("%d\n", atoi(&c));
system("pause");
return 0;
}