### 思路
1. **初始化栈**:创建两个栈,一个用于存储操作数,另一个用于存储操作符。
2. **遍历表达式**:逐个字符检查:
- 如果是数字,读取完整数字并压入操作数栈。
- 如果是操作符,根据优先级处理:
- 如果当前操作符优先级高于栈顶操作符,压入操作符栈。
- 否则,从操作符栈弹出操作符并从操作数栈弹出两个操作数进行计算,将结果压入操作数栈,重复此过程直到当前操作符优先级高于栈顶操作符。
- 如果是左括号,直接压入操作符栈。
- 如果是右括号,弹出操作符栈顶操作符并进行计算,直到遇到左括号。
3. **处理剩余操作符**:遍历结束后,处理操作符栈中剩余的操作符。
4. **输出结果**:操作数栈顶即为最终结果。
### 伪代码
```
function InitStack(S):
allocate memory for S.base of size STACK_INIT_SIZE
S.top = S.base
S.stacksize = STACK_INIT_SIZE
return OK
function Push(S, e):
if S.top - S.base >= S.stacksize:
reallocate memory for S.base with size S.stacksize + STACKINCREMENT
S.top = S.base + S.stacksize
S.stacksize += STACKINCREMENT
S.top = e
S.top += 1
return OK
function Pop(S, e):
if S.top == S.base:
return ERROR
S.top -= 1
e = S.top
return OK
function GetTop(S, e):
if S.top == S.base:
return ERROR
e = S.top - 1
return OK
function precedence(op):
if op is '+' or '-':
return 1
if op is '*' or '/':
return 2
return 0
function applyOp(a, b, op):
if op is '+':
return a + b
if op is '-':
return a - b
if op is '*':
return a * b
if op is '/':
return a / b
function evaluate(expression):
initialize stack values
initialize stack ops
for each character in expression:
if character is digit:
read full number and push to values
else if character is '(':
push to ops
else if character is ')':
while top of ops is not '(':
pop from values and ops, apply operation, push result to values
pop '(' from ops
else if character is operator:
while ops is not empty and precedence of top of ops >= precedence of character:
pop from values and ops, apply operation, push result to values
push character to ops
while ops is not empty:
pop from values and ops, apply operation, push result to values
return top of values
```
### C++代码
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <cstring>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10 // 存储空间分配增量typedef int SElemType; // 定义栈元素类型
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
using namespace std;struct SqStack {SElemType *base; // 在栈构造之前和销毁之后,base的值为NULLSElemType *top; // 栈顶指针int stacksize; // 当前已分配的存储空间,以元素为单位
}; // 顺序栈Status InitStack(SqStack &S) {S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));if (!S.base) return ERROR;S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;
}Status Push(SqStack &S, SElemType e) {if (S.top - S.base >= S.stacksize) {S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));if (!S.base) return ERROR;S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return OK;
}Status Pop(SqStack &S, SElemType &e) {if (S.top == S.base) return ERROR;e = *--S.top;return OK;
}Status GetTop(SqStack S, SElemType &e) {if (S.top == S.base) return ERROR;e = *(S.top - 1);return OK;
}char prio(char e, char c) { // 比较运算符优先级char n;switch (c) {case '+':case '-':n = (e == '(' || e == '=') ? '<' : '>';break;case '*':case '/':n = (e == '*' || e == '/' || e == ')') ? '>' : '<';break;case '(':if (e == ')') {printf("括号不匹配\n");exit(ERROR);}n = '<';break;case ')':if (e == '(') n = '=';else if (e == '=') {printf("缺少左括号\n");exit(ERROR);} else n = '>';break;case '=':if (e == '=') n = '=';else if (e == '(') {printf("缺少右括号\n");exit(ERROR);} else n = '>';break;}return n;
}int main() {SqStack s1, s2; // s1操作数栈,s2算符栈InitStack(s1);InitStack(s2);Push(s2, '=');char w;w = getchar();int e;GetTop(s2, e);while (w != '=' || e != '=') {int d = 0;if (w >= '0' && w <= '9') {while (w >= '0' && w <= '9') {d = d * 10 + (w - '0');w = getchar();}Push(s1, d);} else {if (prio(e, w) == '<') {Push(s2, w);w = getchar();} else if (prio(e, w) == '=' && w == ')') {int t;Pop(s2, t);w = getchar();} else if (prio(e, w) == '>') {int a, b, c = 0, d;Pop(s1, a);Pop(s1, b);Pop(s2, d);if (d == '+') c = a + b;else if (d == '-') c = b - a;else if (d == '/') c = b / a;else if (d == '*') c = b * a;Push(s1, c);}}GetTop(s2, e);}int r;Pop(s1, r);cout << r << endl;return 0;
}