试设计一个算术四则运算表达式求值的简单计算器。 基本要求: 1、 操作数均为非负整数常数,操作符仅为+、-、*、/、、; 2、 编写 main 函数进行测试
时间: 2023-10-20 18:20:42 浏览: 105
好的,让我来为你设计一个算术四则运算表达式求值的简单计算器。
代码如下:
```C++
#include <iostream>
#include <stack>
#include <string>
#include <cstdlib>
using namespace std;
int main()
{
string exp;
cout << "请输入四则运算表达式:";
getline(cin, exp);
stack<int> numStack;
stack<char> opStack;
for (int i = 0; i < exp.length(); i++)
{
char ch = exp[i];
if (ch >= '0' && ch <= '9')
{
int num = 0;
while (i < exp.length() && exp[i] >= '0' && exp[i] <= '9')
{
num = num * 10 + exp[i] - '0';
i++;
}
i--;
numStack.push(num);
}
else if (ch == '+' || ch == '-')
{
while (!opStack.empty() && (opStack.top() == '*' || opStack.top() == '/' || opStack.top() == '+' || opStack.top() == '-'))
{
int num2 = numStack.top();
numStack.pop();
int num1 = numStack.top();
numStack.pop();
char op = opStack.top();
opStack.pop();
int res;
if (op == '+')
{
res = num1 + num2;
}
else
{
res = num1 - num2;
}
numStack.push(res);
}
opStack.push(ch);
}
else if (ch == '*' || ch == '/')
{
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 res;
if (op == '*')
{
res = num1 * num2;
}
else
{
res = num1 / num2;
}
numStack.push(res);
}
opStack.push(ch);
}
else if (ch == '(')
{
opStack.push(ch);
}
else if (ch == ')')
{
while (!opStack.empty() && opStack.top() != '(')
{
int num2 = numStack.top();
numStack.pop();
int num1 = numStack.top();
numStack.pop();
char op = opStack.top();
opStack.pop();
int res;
if (op == '+')
{
res = num1 + num2;
}
else if (op == '-')
{
res = num1 - num2;
}
else if (op == '*')
{
res = num1 * num2;
}
else
{
res = num1 / num2;
}
numStack.push(res);
}
opStack.pop();
}
}
while (!opStack.empty())
{
int num2 = numStack.top();
numStack.pop();
int num1 = numStack.top();
numStack.pop();
char op = opStack.top();
opStack.pop();
int res;
if (op == '+')
{
res = num1 + num2;
}
else if (op == '-')
{
res = num1 - num2;
}
else if (op == '*')
{
res = num1 * num2;
}
else
{
res = num1 / num2;
}
numStack.push(res);
}
cout << "结果为:" << numStack.top() << endl;
return 0;
}
```
解释:
在程序中,我们首先输入用户输入的四则运算表达式。
然后我们利用两个栈 numStack 和 opStack,分别存储数字和操作符。
我们从左到右遍历表达式中的每个字符,如果是数字,就使用 while 循环来不断取出该数字的每一位,然后将得到的数字压入数字栈中。如果是操作符,就需要判断该操作符与栈顶操作符的优先级,以决定是直接将该操作符压栈还是弹出栈顶元素进行运算。当遇到左括号时,直接将其压栈;当遇到右括号时,需要不断弹出栈顶元素进行运算,直到遇到左括号。
最后,当表达式遍历完毕后,还需要将栈中剩余的元素一一弹出进行运算,直到 numStack 栈中只剩下一个数字,即表达式的最终结果。
请注意,本程序仅适用于操作数仅为非负整数常数,并且操作符仅为 +、-、*、/、(、) 的简单四则运算表达式,对于其他情况不保证正确性。
阅读全文