用dev++运行利用栈求表达式的值 能够完成加诚乘除及带括号的四则混合整数运算: 1运算符为加(“+”)、诚(“-”)、乘(“*”)、除(“/”): 2.运算数是整数,且位数不限(如:3、33、333): 3.括号(“(”和“)”),括号用于高优先级运算,一个运算可以被多重 括号所包围,如:“((1+2))*3〞是合法的: 1.当用户输入的表达式合法,则给出计算结果,如果表达式非法,则给出 错误提示。
时间: 2023-10-08 16:05:50 浏览: 46
下面是一个用栈求表达式值的C++程序示例:
```c++
#include <iostream>
#include <stack>
#include <cctype>
using namespace std;
// 定义运算符优先级
int priority(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
// 计算两个数的结果
int calculate(int a, int b, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
return 0;
}
}
// 判断一个字符是否是运算符
bool isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
// 判断一个字符是否是数字
bool isDigit(char c) {
return isdigit(c);
}
// 计算表达式的值
int evaluateExpression(string expression) {
stack<char> opStack; // 运算符栈
stack<int> numStack; // 数字栈
for (int i = 0; i < expression.length(); i++) {
char c = expression[i];
if (isDigit(c)) { // 如果是数字
int num = c - '0'; // 将字符转换为数字
while (i + 1 < expression.length() && isDigit(expression[i + 1])) {
num = num * 10 + (expression[i + 1] - '0');
i++;
}
numStack.push(num); // 将数字入栈
} else if (c == '(') { // 如果是左括号
opStack.push(c); // 将左括号入栈
} else if (c == ')') { // 如果是右括号
while (!opStack.empty() && opStack.top() != '(') {
char op = opStack.top(); // 取出运算符
opStack.pop(); // 弹出运算符
int b = numStack.top(); // 取出第二个操作数
numStack.pop(); // 弹出第二个操作数
int a = numStack.top(); // 取出第一个操作数
numStack.pop(); // 弹出第一个操作数
int result = calculate(a, b, op); // 计算结果
numStack.push(result); // 将结果入栈
}
if (!opStack.empty() && opStack.top() == '(') {
opStack.pop(); // 弹出左括号
} else {
cerr << "Error: Mismatched parentheses." << endl;
return 0;
}
} else if (isOperator(c)) { // 如果是运算符
while (!opStack.empty() && priority(opStack.top()) >= priority(c)) {
char op = opStack.top(); // 取出运算符
opStack.pop(); // 弹出运算符
int b = numStack.top(); // 取出第二个操作数
numStack.pop(); // 弹出第二个操作数
int a = numStack.top(); // 取出第一个操作数
numStack.pop(); // 弹出第一个操作数
int result = calculate(a, b, op); // 计算结果
numStack.push(result); // 将结果入栈
}
opStack.push(c); // 将当前运算符入栈
} else {
cerr << "Error: Invalid expression." << endl;
return 0;
}
}
while (!opStack.empty()) {
char op = opStack.top(); // 取出运算符
opStack.pop(); // 弹出运算符
int b = numStack.top(); // 取出第二个操作数
numStack.pop(); // 弹出第二个操作数
int a = numStack.top(); // 取出第一个操作数
numStack.pop(); // 弹出第一个操作数
int result = calculate(a, b, op); // 计算结果
numStack.push(result); // 将结果入栈
}
if (numStack.size() == 1) {
return numStack.top();
} else {
cerr << "Error: Invalid expression." << endl;
return 0;
}
}
int main() {
string expression;
cout << "Please enter an expression: ";
getline(cin, expression);
int result = evaluateExpression(expression);
cout << "Result: " << result << endl;
return 0;
}
```
这个程序可以计算加、减、乘、除以及带括号的四则混合整数运算。例如,输入表达式:
```
(2+3)*4-5/2
```
程序会输出结果:
```
Result: 16
```