利用栈计算表达式代码c++
时间: 2023-10-21 20:31:48 浏览: 45
下面是一个简单的栈实现计算表达式的 C++ 代码:
```c++
#include <iostream>
#include <stack>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
int main()
{
stack<int> numStack; // 存储操作数的栈
stack<char> opStack; // 存储运算符的栈
string expr;
cout << "请输入表达式:";
getline(cin, expr);
for(int i = 0; i < expr.length(); i++)
{
if(expr[i] == ' ')
continue;
if(expr[i] >= '0' && expr[i] <= '9')
{
int num = 0;
while(i < expr.length() && expr[i] >= '0' && expr[i] <= '9')
{
num = num * 10 + (expr[i] - '0');
i++;
}
numStack.push(num);
i--;
}
else if(expr[i] == '(')
{
opStack.push(expr[i]);
}
else if(expr[i] == ')')
{
while(opStack.top() != '(')
{
int num2 = numStack.top();
numStack.pop();
int num1 = numStack.top();
numStack.pop();
char op = opStack.top();
opStack.pop();
int result;
if(op == '+')
result = num1 + num2;
else if(op == '-')
result = num1 - num2;
else if(op == '*')
result = num1 * num2;
else if(op == '/')
result = num1 / num2;
numStack.push(result);
}
opStack.pop(); // 弹出左括号
}
else if(expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/')
{
while(!opStack.empty() && (opStack.top() == '*' || opStack.top() == '/'))
{
int num2 = numStack.top();
numStack.pop();
int num1 = numStack.top();
numStack.pop();
char op = opStack.top();
opStack.pop();
int result;
if(op == '+')
result = num1 + num2;
else if(op == '-')
result = num1 - num2;
else if(op == '*')
result = num1 * num2;
else if(op == '/')
result = num1 / num2;
numStack.push(result);
}
opStack.push(expr[i]);
}
}
while(!opStack.empty())
{
int num2 = numStack.top();
numStack.pop();
int num1 = numStack.top();
numStack.pop();
char op = opStack.top();
opStack.pop();
int result;
if(op == '+')
result = num1 + num2;
else if(op == '-')
result = num1 - num2;
else if(op == '*')
result = num1 * num2;
else if(op == '/')
result = num1 / num2;
numStack.push(result);
}
cout << "计算结果是:" << numStack.top() << endl;
return 0;
}
```
该代码中,首先定义了两个栈,一个用于存储操作数,一个用于存储运算符。接下来,遍历表达式字符串,如果遇到数字字符,则将其转换为整数,并压入操作数栈中;如果遇到左括号,则将其压入运算符栈中;如果遇到右括号,则弹出运算符栈中的运算符和操作数栈中的两个操作数,进行计算,并将计算结果压入操作数栈中,直到遇到左括号为止;如果遇到运算符,则将其与运算符栈中的栈顶元素进行比较,如果栈顶元素是乘号或除号,则进行计算,直到运算符栈顶元素不是乘号或除号或者运算符栈为空,然后将当前运算符压入运算符栈中。最后,如果运算符栈不为空,则弹出栈中的运算符和操作数,进行计算,直到运算符栈为空,操作数栈中只剩下一个元素,即为表达式的计算结果。