求值的程序可以根据不同的需求和算法来编写。以下是一个简单的C++程序,用于计算后缀表达式的值。这个程序使用了两个栈,一个用于操作数(OPND),另一个用于操作符(OPTR)。程序通过读取输入的表达式,使用栈来处理运算符的优先级,并最终计算出结果。
```cpp
include include include include using namespace std; // 定义栈结构体 typedef stack typedef stack // 定义操作符的优先级 map {'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}, {'(', 0}, {')', 0} }; // 检查字符串中有否除了0-9,之外的其他字符 int CheckString(const char *Str) { for (int i = 0; Str[i] != '\0'; i++) { if (!isdigit(Str[i])) { return 0; } } return 1; } // 将当前已经完成运算的运算符消去,同时将数值数组的位置调整以进行下一次运算 void DealString(char *OperatorArr, double *DigitalArr, int CurrPosition) { while (CurrPosition >= 0 && CheckString(OperatorArr + CurrPosition)) { double b = DigitalArr[CurrPosition--]; double a = DigitalArr[CurrPosition--]; char op = OperatorArr[CurrPosition--]; switch (op) { case '+': DigitalArr[++CurrPosition] = a + b; break; case '-': DigitalArr[++CurrPosition] = a - b; break; case '*': DigitalArr[++CurrPosition] = a * b; break; case '/': DigitalArr[++CurrPosition] = a / b; break; } } } // 计算后缀表达式的值 double ExpEvaluation(char *Expression) { OPTR OPTRStack; OPND OPNDStack; int i = 0; // 处理表达式中的空格 while (Expression[i] == ' ') { i++; } // 将表达式中的操作数和操作符分别压入栈中 while (Expression[i] != '\0') { if (isdigit(Expression[i])) { double num = 0; while (isdigit(Expression[i])) { num = num * 10 + (Expression[i] - '0'); i++; } OPNDStack.push(num); } else { switch (Expression[i]) { case '(': OPTRStack.push(Expression[i]); i++; break; case ')': while (OPTRStack.top() != '(') { DealString(Expression, OPNDStack.data(), i - 1); } OPTRStack.pop(); i++; break; default: while (!OPTRStack.empty() && oper_prio[Expression[i]] <= oper_prio[OPTRStack.top()]) { DealString(Expression, OPNDStack.data(), i - 1); } OPTRStack.push(Expression[i]); i++; break; } } } // 处理剩下的运算符 while (!OPTRStack.empty()) { DealString(Expression, OPNDStack.data(), i - 1); } return OPNDStack.top(); } int main() { char expression; cout << "请输入一个后缀表达式(例如:23*34-21+(56*(45-1))):"; cin.getline(expression, 100); double result = ExpEvaluation(expression); cout << "表达式的结果是:" << result << endl; return 0; } ``` 代码解析 `OPTR` 和 `OPND` 分别用于存储操作符和操作数。 `oper_prio` 是一个映射,用于存储操作符的优先级。栈的定义