实现简易计算器,包括后缀表达式计算、中缀表达式计算和中缀转后缀表达式。其中,操作符包括加、减、乘、除,操作数为0-9之间的整数。利用c++语言并在c++98mode下实现,并测试输出成功代码
时间: 2024-10-19 11:12:17 浏览: 37
C++实现中缀表达式转后缀表达式
在C++98模式下实现一个简易计算器,我们可以分别创建三个函数:一种用于后缀表达式的计算(也称为逆波兰表示法),一种用于中缀表达式的计算,以及一种将中缀表达式转换为后缀表达式。这里我们使用栈数据结构来处理这些问题。
首先,我们需要一个基础的计算器函数:
```cpp
#include <iostream>
#include <stack>
#include <string>
// 定义基本的运算符优先级
const int PRECEDENCE[] = {1, 2, 3, 4}; // 加(1), 减(2), 乘(3), 除(4)
bool isOperator(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/');
}
int calculatePostfix(const std::string &postfix) {
std::stack<int> values;
for (char c : postfix) {
if (isdigit(c)) {
values.push(c - '0'); // 转换为数字并压入栈
} else {
int op2 = values.top(); // 取出栈顶的操作数
values.pop();
int op1 = values.top(); // 取出次高操作数
values.pop();
switch (c) {
case '+': values.push(op1 + op2); break;
case '-': values.push(op1 - op2); break;
case '*': values.push(op1 * op2); break;
case '/':
if (op2 != 0) values.push(op1 / op2);
else throw "Error: Division by zero";
break;
}
}
}
return values.top(); // 返回最终结果
}
std::string infixToPostfix(const std::string &infix) {
std::stack<char> ops;
std::string postfix;
for (char c : infix) {
if (!isOperator(c) || !ops.empty() && PRECEDENCE[ops.top()] >= PRECEDENCE[c]) {
postfix += c; // 非运算符或优先级低的运算符直接添加到后缀表达式
} else {
postfix += c;
while (!ops.empty() && PRECEDENCE[ops.top()] >= PRECEDENCE[c])
postfix += ops.top(), ops.pop();
ops.push(c);
}
}
while (!ops.empty())
postfix += ops.top(), ops.pop();
return postfix;
}
int main() {
try {
std::string infixExp = "2+3*4";
std::string postfixExp = infixToPostfix(infixExp);
std::cout << "Infix to Postfix: " << infixExp << " -> " << postfixExp << "\n";
int result = calculatePostfix(postfixExp);
std::cout << "Postfix Evaluation: " << postfixExp << " = " << result << "\n";
} catch (const std::exception &e) {
std::cerr << "Error: " << e.what() << '\n';
}
return 0;
}
```
在这个例子中,`calculatePostfix`函数处理后缀表达式,`infixToPostfix`函数负责中缀到后缀的转换。在`main`函数中,我们提供了一个简单的中缀表达式作为示例,并展示了其转换和计算的过程。
注意:这个代码假设输入的中缀表达式是合法的,并且不会出现除以零的情况。在实际应用中,需要加入更完整的错误检查。
相关问题:
1. 这段代码如何处理括号内的运算?
2. 如果中缀表达式中含有负数,该如何修改?
3. 对于非数学运算如取模(%),该如何扩展此代码?
阅读全文