C++编写逆波兰表达式求解程序出现==运算符不匹配报错如何解决
报错根因
你遇到的no operator "==" matches these operands -- operand types are: info == char编译错误,本质是你自定义的info联合体没有定义与char类型的相等比较规则,C++不会自动为自定义类型生成跨类型的比较运算符,所以你直接将info实例和字符做==比较时,编译器无法识别该操作。
修复方案
- 所有
info和字符的比较逻辑显式访问ch成员
所有涉及info类型和字符比对的代码,都要显式指定访问联合体的ch成员,修改示例:
// 原checkop函数内的判断 if (ch.ch == '+' ||ch.ch =='-'||ch.ch =='*'||ch.ch =='/'||ch.ch =='^') // 原calc函数内的判断 if (curr.ch == ')') // 原main函数内的判断 if (x.ch == 'B')
- 给
info增加类型标记避免访问越界
当前你的info联合体没有存储类型标记,运行时无法判断当前存储的是运算符字符还是数值,访问错误成员会导致未定义行为,建议修改info定义:
struct info { // 类型标记,区分当前存储的是字符还是数字 enum {CHAR, NUM} type; union { char ch; float num; }; };
后续赋值时同步设置type,比如存运算符时设type = CHAR,存数字时设type = NUM,访问前先判断type再访问对应成员。
3. 修复其他已知问题
- 补充头文件:代码需要引入
<iostream>、<cmath>头文件才能正常编译 - 修复输入逻辑:C++不支持直接用
cin给自定义info类型赋值,需要先读取输入内容,判断是数字还是运算符后再给info的对应成员赋值 - 修复参数错误:
eval函数调用时缺少运算符参数,insertxp、insertrst调用时参数类型不匹配的问题 - 初始化栈指针:你定义的全局栈头指针
st、rs没有初始化,直接使用会触发空指针崩溃,需要在main函数开头先初始化头节点
内容的提问来源于stack exchange,提问作者Agrim Kaundal
相关产品推荐
相关产品推荐

