写一个c++程序实现以上描述
时间: 2024-10-12 17:09:05 浏览: 16
要编写一个C++程序来计算后缀表达式的值,可以使用堆栈(stack)数据结构。以下是一个简单的C++程序示例,利用递归的方式实现:
```cpp
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
// 定义操作符优先级
int precedence(char op) {
if (op == '+' || op == '-') return 1;
else if (op == '*' || op == '/') return 2;
return 0; // 操作符默认优先级较低
}
// 函数用于计算后缀表达式的值
int evaluatePostfix(std::string &postfixExp) {
std::istringstream iss(postfixExp);
std::vector<int> stack;
char token;
while (iss >> token) {
if (isdigit(token)) { // 遇到数字,直接入栈
stack.push_back(token - '0');
} else { // 遇到操作符
while (!stack.empty() && precedence(stack.back()) >= precedence(token)) {
int num2 = stack.pop_back();
int num1 = stack.pop_back();
switch (token) {
case '+':
stack.push_back(num1 + num2);
break;
case '-':
stack.push_back(num1 - num2);
break;
case '*':
stack.push_back(num1 * num2);
break;
case '/':
stack.push_back((int)(num1 / num2)); // 注意这里防止整数除以整数溢出
break;
}
}
stack.push_back(token); // 保存操作符到栈中,等待其后的操作数
}
}
while (!stack.empty()) {
int num2 = stack.pop_back();
int num1 = stack.pop_back();
switch (stack.back()) {
case '+':
stack.push_back(num1 + num2);
break;
case '-':
stack.push_back(num1 - num2);
break;
case '*':
stack.push_back(num1 * num2);
break;
case '/':
stack.push_back((int)(num1 / num2));
break;
}
}
return stack.back(); // 返回最后的栈顶元素作为表达式值
}
int main() {
std::string postfixExp = "16 9 4 3 + * -";
int result = evaluatePostfix(postfixExp);
std::cout << "后缀表达式的值: " << result << std::endl;
return 0;
}
```
在这个程序中,`evaluatePostfix`函数首先通过`istringstream`解析输入的后缀表达式,并使用堆栈存储操作数。遇到操作符时,它会检查堆栈顶部的操作符优先级,如果有更高优先级的操作符则先执行。最后,所有操作数都被计算并返回结果。
运行这个程序,你会看到输出 `-145`,对应样例中的结果。
阅读全文