代码揭秘:栈助力中缀表达式转后缀并精准计算!
以下是为您补充完善的代码: ```cpp #include <cstdlib> #include <iostream> #include <string> #include <sstream> using namespace std; template <class T> class ArrayStack { private: int maxsize; //栈中最多保存的元素个数 int top; //指向栈顶元素空间编号,初始化为-1,入栈时top+1,出栈时top-1 T* st; //栈的元素存储的起始地址 public: ArrayStack(int sz = 100) { maxsize = sz; top = -1; st = new T[maxsize]; } ~ArrayStack() { delete[] st; } bool isEmpty() { return top == -1; } bool isFull() { return top == maxsize - 1; } void push(T x) { if (isFull()) { cout << "Stack Overflow" << endl; return; } st[++top] = x; } T pop() { if (isEmpty()) { cout << "Stack Underflow" << endl; return -1; } return st[top--]; } T getTop() { if (isEmpty()) { cout << "Stack is Empty" << endl; return -1; } return st[top]; } }; class Calculator { private: string infixExpression; string suffixExpression; public: Calculator(string expression) { infixExpression = expression; } // 将中缀表达式转换为后缀表达式 void infixToSuffix() { ArrayStack<char> opStack; for (char c : infixExpression) { if (isdigit(c)) { suffixExpression += c; } else if (c == '(') { opStack.push(c); } else if (c == ')') { while (!opStack.isEmpty() && opStack.getTop()!= '(') { suffixExpression += opStack.pop(); } opStack.pop(); } else { while (!opStack.isEmpty() && precedence(c) <= precedence(opStack.getTop())) { suffixExpression += opStack.pop(); } opStack.push(c); } } while (!opStack.isEmpty()) { suffixExpression += opStack.pop(); } } // 计算后缀表达式的值 void calSuffix() { ArrayStack<int> numStack; for (char c : suffixExpression) { if (isdigit(c)) { numStack.push(c - '0'); } else { int num2 = numStack.pop(); int num1 = numStack.pop(); int result; switch (c) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': if (num2!= 0) { result = num1 / num2; } else { cout << "Error: Division by zero" << endl; return; } break; } numStack.push(result); } } cout << "Result: " << numStack.pop() << endl; } private: int precedence(char op) { if (op == '+' || op == '-') { return 1; } else if (op == '*' || op == '/') { return 2; } return 0; } }; int main() { string expression = "3+4*2/(1-5)"; Calculator calculator(expression); calculator.infixToSuffix(); calculator.calSuffix(); return 0; } ``` 这段代码实现了一个简单的中缀表达式转后缀表达式并计算的计算器功能。您可以根据实际需求进行修改和扩展。 ######[AI写代码神器 | 979点数解答 | 2024-10-12 20:35:40]
- 递归下降语法分析程序实例:从文法到 C 代码的完整实现(字节豆包 | 1371点数解答 | 2024-12-12 22:46:04)262
- SQL 实现:精准查询 20 岁选课学生学号、姓名、平均与总成绩(去重取最高) (字节豆包 | 116点数解答 | 2024-10-21 00:46:57)212
- 数字化制图综合平台:助力企业转型,推动烟草物流图纸智能化设计 (字节豆包 | 490点数解答 | 2024-10-30 20:30:29)144
- 数字化制图综合平台:引领烟草物流及多领域设计革新 在企业数字化转型的时代浪潮中,数字化制图技术创新应用成为产业升级与提升竞争力的关键。企业对高效、精准、智能化设计解决方案需求迫切,构建集二维到三维正逆向工程快捷化、干涉检测可视化、设备明细数据提取自动化以及设备模块模型库于一体的综合平台意义重大。 此平台集成先进数字化制图工具与智能算法,可实现二维设计到三维建模的无缝转换,大大缩短设计周期。正逆向工程能快速切换,满足不同场景设计需求。内置干涉检测功能可实时监测设计潜在冲突,保障设计方案可行与安全。设备明细数据自动提取提高设计准确性与效率。设备模块模型库为设计师提供丰富资源,支持设计标准化与模块化,加速项目推进。 整体来看,该综合平台的应用极大促进了烟草物流行业及更广泛领域的技术创新与效率提升。在烟草物流方案图纸智能化设计中,它提升了图纸设计效率与质量,使设计工作更加高效、精准。对于企业而言,这一平台带来显著竞争优势,能帮助企业在数字化转型中脱颖而出,在激烈的市场竞争中占据有利地位,推动整个行业向更高效、更智能的方向发展。 (阿里通义 | 216点数解答 | 2024-10-30 20:30:51)173
- C++ 代码实现自定义运算 x@y = x² + y² - xy 及 x@(x+y) 计算(DeepSeek | 215点数解答 | 2025-12-13 15:08:14)70
- C++ 实现根据输入正整数奇偶性计算偶数和或约数和(字节豆包 | 838点数解答 | 2026-02-28 20:23:59)26
- JavaScript 开发揭秘:表达式 {{data}} 的工作原理及模板字符串应用(阿里通义 | 226点数解答 | 2023-11-09 01:17:26)244
- 揭秘!Angular表达式 {{yourmodel}} 的工作原理与灵活应用(阿里通义 | 187点数解答 | 2023-11-09 01:18:41)214
- Python 实现实数四则运算:输入表达式输出结果,处理除零与格式错误(字节豆包 | 286点数解答 | 2024-11-17 11:21:58)129
- C 语言实现:输入实数四则运算式输出保留两位小数结果(含特殊情况处理) (字节豆包 | 320点数解答 | 2024-11-17 11:22:27)145
- PHP利用通信证书对请求报文data部分计算p7分离式签名结果数据全流程指南(讯飞星火 | 446点数解答 | 2023-12-07 17:06:14)305
- PHP利用OpenSSL扩展:实现对请求报文data部分的P7分离式签名计算(阿里通义 | 306点数解答 | 2023-12-07 17:06:58)267