表达式求值是程序设计语言编译中最基本的问题,它要求把一个表达式翻译成能够直接 求值的序列。例如用户输入字符串“14+((13-2)2-115)2”,程序可以自动计算得到最终的 结果。在这里,我们将问题简化,假定算数表达式的值均为非负整数常数,不包含变量、小 数和字符常量。 试设计一个算术四则运算表达式求值的简单计算器。 基本要求: 1、 操作数均为非负整数常数,操作符仅为+、-、*、/; 2、 编写 main 函数进行测试。
时间: 2023-06-04 14:04:43 浏览: 159
非常感谢您的问题,我将尽力解答。根据您的要求,我理解您的问题是关于设计一个算术四则运算表达式求值的简单计算器的。以下是我的回答:
针对这个问题,可以通过以下步骤实现:
1.通过用户输入获取待计算的算术表达式字符串。
2.将字符串转化为逆波兰表达式(后缀表达式),这个步骤可以使用栈来实现。
3.对逆波兰表达式进行求值,同样可以使用栈来实现。
下面给出参考代码:
```
#include <iostream>
#include <stack>
#include <string>
using namespace std;
//判断是否为操作符
bool isOperator(char c){
if(c == '+' || c == '-' || c == '*' || c == '/'){
return true;
}else {
return false;
}
}
//比较运算符优先级/权值
int getPriority(char op){
if(op == '+' || op == '-')
return 1;
if(op == '*' || op == '/')
return 2;
return -1;
}
//将中缀表达式转化为后缀表达式(逆波兰表达式)
string infixToPostfix(string expression){
string result = "";
stack<char> mystack;
for(int i = 0; i < expression.length(); i++){
char c = expression[i];
if(c == ' ') continue; //跳过空格
if(isdigit(c)){ //如果是数字将其加入到输出字符串中
while(i < expression.length() && isdigit(expression[i])){
result += expression[i++];
}
result += " ";
i--;
}else if(isOperator(c)){ //如果是运算符
while(!mystack.empty() && getPriority(c) <= getPriority(mystack.top())){
result += mystack.top();
mystack.pop();
result += " ";
}
mystack.push(c);
}else if(c == '('){
mystack.push(c);
}else if(c == ')'){
while(!mystack.empty() && mystack.top() != '('){
result += mystack.top();
mystack.pop();
result += " ";
}
mystack.pop();
}
}
while(!mystack.empty()){
result += mystack.top();
mystack.pop();
result += " ";
}
return result;
}
//计算逆波兰表达式的值
int evalRPN(string expression){
stack<int> mystack;
for(int i = 0; i < expression.length(); i++){
char c = expression[i];
if(c == ' ') continue; //跳过空格
if(isdigit(c)){ //如果是数字
int num = 0;
while(i < expression.length() && isdigit(expression[i])){
num = num * 10 + (expression[i++] - '0');
}
mystack.push(num);
i--;
}else if(isOperator(c)){ //如果是运算符
int num1 = mystack.top();
mystack.pop();
int num2 = mystack.top();
mystack.pop();
int result;
switch(c){
case '+': result = num2 + num1; break;
case '-': result = num2 - num1; break;
case '*': result = num2 * num1; break;
case '/': result = num2 / num1; break;
default: break;
}
mystack.push(result);
}
}
return mystack.top();
}
int main(){
string input, postfix;
cout << "请输入一个算术表达式(仅包含非负整数和四则运算符):" << endl;
getline(cin, input); //获取用户输入
postfix = infixToPostfix(input);
cout << "逆波兰表达式为:" << postfix << endl;
int result = evalRPN(postfix);
cout << "计算结果为:" << result << endl;
return 0;
}
```
以上是一个简单的算术表达式求值计算器,通过先将中缀表达式转化为逆波兰表达式,然后再通过栈来求解。此程序可以接受用户输入,支持四则运算符号,并且输出计算结果。
注意:该代码中并未添加对错误表达式的处理,如遇到错误表达式会直接终止程序运行。同时,如果需要支持负数的计算,还需要对其进行额外处理。
阅读全文