RPN表达式计算C程序Bug排查:复杂表达式输出异常
问题分析与修复方案
你的RPN计算程序处理复杂表达式出错,核心原因是栈的类型不匹配,以及数值存储与读取的逻辑错误。
具体问题点
- 栈存储类型错误:你用
char stack[STACK_SIZE]存储操作数,但实际需要存储的是整数数值,而非字符的ASCII码。- 输入数字'8'时,你push的是ASCII值56;但运算后比如计算4-5得到-1,直接把整数-1存入char栈,存储的是对应ASCII字符,最后输出时直接取stack[0]作为整数,完全偏离正确数值。
- 运算结果存储逻辑错误:即使强行用char栈,运算后的整数结果也需要转为对应ASCII字符(加48),但负数无法用单个ASCII字符表示,这说明栈的类型根本不应该是char。
修复后的代码
把栈的类型改为int,同时调整push、pull及数值处理逻辑:
#include <stdio.h> #include <stdbool.h> #include <stdlib.h> #define STACK_SIZE 99 int top = 0; int stack[STACK_SIZE]; // 改为int类型栈 bool is_full(); bool is_empty(); void push(int); // 参数改为int int pull(); // 返回值改为int void stack_underflow(); void stack_overflow(); int main(void) { int first_op, sec_op, ch; // 操作数改为int类型 printf("Enter an RPN expression: "); for(;;) { scanf(" %c", &ch); if (ch <= '9' && ch >= '0') push(ch - 48); // 输入字符转整数后入栈 else if (ch != '=') { sec_op = pull(); first_op = pull(); switch (ch) { case '+': push(first_op + sec_op); break; case '-': push(first_op - sec_op); break; case '*': push(first_op * sec_op); break; case '/': if (sec_op == 0) { printf("Division by zero\n"); exit(EXIT_FAILURE); } push(first_op / sec_op); break; default: printf("Invalid operator\n"); exit(EXIT_FAILURE); } } if (ch == '=') { if (top != 1) { // 检查栈中是否只剩一个结果 printf("Too many operands\n"); exit(EXIT_FAILURE); } printf("%d\n", stack[0]); exit(EXIT_SUCCESS); } } } bool is_full(void) { return (top == STACK_SIZE); } bool is_empty(void) { return top == 0; } void push(int num) // 入栈整数 { if (is_full()) stack_overflow(); else stack[top++] = num; } int pull(void) // 出栈整数 { if (is_empty()) stack_underflow(); else return stack[--top]; } void stack_overflow(void) { printf("Too complex expression\n"); exit(EXIT_FAILURE); } void stack_underflow(void) { printf("Not enough operands\n"); exit(EXIT_FAILURE); }
修复说明
- 将栈的类型从
char改为int,直接存储整数数值,避免ASCII码转换错误。 - 输入数字字符时,立即转换为整数(
ch - 48)再入栈,而非存储字符。 - 运算后的结果直接以整数入栈,无需额外转换。
- 新增除法除零检查、表达式结束时栈元素数量检查,避免多余操作数残留。
现在测试表达式8 4 5 - * =,程序会正确计算8*(4-5)=-8并输出。
内容的提问来源于stack exchange,提问作者Udbhav Dikshit
相关产品推荐
相关产品推荐

