算法思路;
遍历后缀表达式中的数字和符号
对数字:进栈
对于符号:
从栈中弹出右操作数
从栈中弹出左操作数
根据符号进行运算
将结果压入栈中
遍历结束: 栈中唯一数字为计算结果。
// 栈的应用后缀表达式计算.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include"LinkStack.h" #include<stdio.h> #include<stdlib.h> #include<string.h> #include"linklist.h" int isNumber(char c) { return('0' <= c) && (c <= '9'); } int isOperator(char c) { return (c == '+') || (c == '-') || (c == '*') || (c == '/'); } int express(int left,int right,char op) { int ret = 0; switch (op) { case'+': ret = left + right; break; case'-': ret = left - right; break; case'*': ret = left * right; break; case'/': ret = left / right; break; default: break; } return ret; } int computer(const char* exp) { LinkStack* stack = Stack_Create(); int ret = 0; int i = 0; while (exp[i]!='\0') { if (isNumber(exp[i])) { Stack_Push(stack, (void*)(int)exp[i]); } else if (isOperator(exp[i])) { int right = (int)Stack_Pop(stack); int left = (int)Stack_Pop(stack); int result = express(left, right, exp[i]); Stack_Push(stack,(void*)result); } else { printf("invalid expression"); break; } i++; } if (Stack_Size(stack)==1&&exp[i]=='\0') { ret = (int)Stack_Pop(stack); } else { printf("Invalid expression"); } Stack_Destory(stack); return ret; } int main() { int res= computer("831-5*+"); printf("8+(3-1)*5=%d\n",res); system("pause"); return 0; }