包含括号桌面计算器代码实现c++
时间: 2023-08-03 14:25:50 浏览: 131
以下是包含括号的桌面计算器的简单代码实现(C++):
```c++
#include<iostream>
#include<stack>
using namespace std;
/* 函数声明 */
int priority(char op); //获取运算符优先级
double calculate(double num1, char op, double num2); //计算表达式
int main() {
string expression; //表达式
stack<char> opStack; //运算符栈
stack<double> numStack; //操作数栈
cout << "请输入表达式: ";
getline(cin, expression);
for (int i = 0; i < expression.length(); i++) {
char ch = expression[i];
if (isdigit(ch)) { //如果是数字,将其转换为double类型并入栈
double num = ch - '0';
i++;
while (i < expression.length() && isdigit(expression[i])) {
num = num * 10 + (expression[i] - '0');
i++;
}
i--; //回退一位
numStack.push(num);
}
else if (ch == '(') { //如果是左括号,直接入栈
opStack.push(ch);
}
else if (ch == ')') { //如果是右括号,则不断弹出运算符和操作数,直到遇到左括号
while (!opStack.empty() && opStack.top() != '(') {
double num2 = numStack.top();
numStack.pop();
double num1 = numStack.top();
numStack.pop();
char op = opStack.top();
opStack.pop();
double result = calculate(num1, op, num2);
numStack.push(result);
}
if (!opStack.empty() && opStack.top() == '(') {
opStack.pop();
}
else {
cout << "错误:表达式不合法" << endl;
return 0;
}
}
else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
while (!opStack.empty() && priority(ch) <= priority(opStack.top())) {
double num2 = numStack.top();
numStack.pop();
double num1 = numStack.top();
numStack.pop();
char op = opStack.top();
opStack.pop();
double result = calculate(num1, op, num2);
numStack.push(result);
}
opStack.push(ch);
}
else if (ch == ' ') { //忽略空格
continue;
}
else { //其他情况,表达式不合法
cout << "错误:表达式不合法" << endl;
return 0;
}
}
//处理剩余的运算符和操作数
while (!opStack.empty()) {
double num2 = numStack.top();
numStack.pop();
double num1 = numStack.top();
numStack.pop();
char op = opStack.top();
opStack.pop();
double result = calculate(num1, op, num2);
numStack.push(result);
}
//输出结果
cout << "计算结果为:" << numStack.top() << endl;
return 0;
}
/* 函数定义 */
int priority(char op) {
if (op == '+' || op == '-') {
return 1;
}
else if (op == '*' || op == '/') {
return 2;
}
else {
return 0;
}
}
double calculate(double num1, char op, double num2) {
switch (op) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
case '*':
return num1 * num2;
case '/':
if (num2 == 0) {
cout << "错误:除数不能为0" << endl;
exit(0);
}
else {
return num1 / num2;
}
default:
cout << "错误:无效的运算符" << endl;
exit(0);
}
}
```
该程序可以处理带有括号的四则运算表达式,并且能够正确计算表达式的值。在处理表达式时,采用了两个栈分别存储运算符和操作数,通过比较优先级来决定是否需要弹出栈顶元素进行运算,最终输出计算结果。
阅读全文