C++ 表达式求值程序开发:处理负数、浮点数及栈操作的关键要点
```cpp #include <iostream> #include <iomanip> #include <cstring> #include <cmath> #define MAXSIZE 100 #define OK 1 #define ERROR 0 #define OVERFLOW -2 using namespace std; typedef struct { char* base; char* top; int stacksize; } SqStack1; int InitStack1(SqStack1& S) { S.base = new char[MAXSIZE]; if (!S.base) return OVERFLOW; S.top = S.base; S.stacksize = MAXSIZE; return OK; } int Push1(SqStack1& S, char e) { if (S.top - S.base == S.stacksize) return ERROR; *S.top++ = e; return OK; } int Pop1(SqStack1& S) { if (S.top == S.base) return ERROR; S.top--; return OK; } char GetTop1(SqStack1 S) { if (S.top == S.base) return ERROR; return *(S.top - 1); } typedef struct { double* base; double* top; int stacksize; } SqStack2; int InitStack2(SqStack2& S) { S.base = new double[MAXSIZE]; if (!S.base) return OVERFLOW; S.top = S.base; S.stacksize = MAXSIZE; return OK; } int Push2(SqStack2& S, double e) { if (S.top - S.base == S.stacksize) return ERROR; *S.top++ = e; return OK; } int Pop2(SqStack2& S) { if (S.top == S.base) return ERROR; S.top--; return OK; } double GetTop2(SqStack2 S) { if (S.top == S.base) return ERROR; return *(S.top - 1); } double Calculate(double a, char op, double b) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': if (fabs(b) < 1e-6) { cout << "除数不能为0" << endl; exit(0); } return a / b; default: return 0; } } char Precede(char a, char b) { if (a == '+' || a == '-') { if (b == '+' || b == '-' || b == ')' || b == '=') return '>'; else return '<'; } else if (a == '*' || a == '/') { if (b == '(') return '<'; else return '>'; } else if (a == '(') { if (b == ')') return '='; else if (b == '=') return ' '; else return '<'; } else if (a == ')') { if (b == '(') return ' '; else return '>'; } else if (a == '=') { if (b == '=') return '='; else if (b == ')') return ' '; else return '<'; } return ' '; } int main() { string str; while (getline(cin, str)) { if (str == "=") break; SqStack1 OPTR; // 运算符栈 SqStack2 OPND; // 操作数栈 InitStack1(OPTR); InitStack2(OPND); Push1(OPTR, '='); int i = 0; int flag = 0; // 负数标志 int decimal = 0; // 小数标志 double num = 0; double factor = 0.1; while (i < str.length()) { if (str[i] == ' ') { i++; continue; } // 处理数字 if ((str[i] >= '0' && str[i] <= '9') || (str[i] == '-' && (i == 0 || str[i-1] == '('))) { if (str[i] == '-') { flag = 1; i++; } num = 0; decimal = 0; factor = 0.1; while ((str[i] >= '0' && str[i] <= '9') || str[i] == '.') { if (str[i] == '.') { decimal = 1; i++; continue; } if (!decimal) { num = num * 10 + (str[i] - '0'); } else { num = num + (str[i] - '0') * factor; factor *= 0.1; } i++; } if (flag) { num = -num; flag = 0; } Push2(OPND, num); } // 处理运算符 else { char theta; char priority = Precede(GetTop1(OPTR), str[i]); switch (priority) { case '<': Push1(OPTR, str[i]); i++; break; case '=': Pop1(OPTR); i++; break; case '>': theta = GetTop1(OPTR); Pop1(OPTR); double b = GetTop2(OPND); Pop2(OPND); double a = GetTop2(OPND); Pop2(OPND); double result = Calculate(a, theta, b); Push2(OPND, result); break; } } } cout << fixed << setprecision(2) << GetTop2(OPND) << endl; } return 0; } ``` 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 处理负数时要注意区分减号和负号,根据上下文判断 2. 浮点数比较要使用精度判断,避免直接使用等号 3. 栈操作时要检查栈空栈满情况,防止越界访问 ######[AI写代码神器 | 1360点数解答 | 2025-11-14 14:57:43]
- 递归下降语法分析程序实例:从文法到 C 代码的完整实现(字节豆包 | 1371点数解答 | 2024-12-12 22:46:04)261
- Python实现Q老师成绩管理任务:修改与查看学生成绩(字节豆包 | 191点数解答 | 2025-12-20 20:55:41)70
- Python 代码助力 Q 老师高效管理班级学生成绩:修改与查看一键搞定(字节豆包 | 326点数解答 | 2025-12-27 20:48:12)70
- SQL 实现:精准查询 20 岁选课学生学号、姓名、平均与总成绩(去重取最高) (字节豆包 | 116点数解答 | 2024-10-21 00:46:57)211
- 工程师必知:软件系统用户文档编写九大要点揭秘(百度文心 | 350点数解答 | 2023-11-09 18:23:53)182
- CentOS下Java进程出现futex_wait_queue_me问题的处理全流程(阿里通义 | 283点数解答 | 2023-11-20 14:51:26)459
- C语言:按序读入浮点数、整数、字符并按新顺序输出,附代码实现 (字节豆包 | 108点数解答 | 2024-09-30 22:54:08)327
- 替雷利珠单抗致免疫相关性糖尿病:病例报道与机制探讨,为临床用药敲响警钟( | 164点数解答 | 2024-10-11 14:52:52)264
- C语言实现:从三人身高输入中精准找出居中身高 (GPT | 395点数解答 | 2024-12-05 11:10:08)194
- JavaScript 开发揭秘:表达式 {{data}} 的工作原理及模板字符串应用(阿里通义 | 226点数解答 | 2023-11-09 01:17:26)244
- 揭秘!Angular表达式 {{yourmodel}} 的工作原理与灵活应用(阿里通义 | 187点数解答 | 2023-11-09 01:18:41)212
- Python 实现实数四则运算:输入表达式输出结果,处理除零与格式错误(字节豆包 | 286点数解答 | 2024-11-17 11:21:58)126