You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RPN表达式计算C程序Bug排查:复杂表达式输出异常

问题分析与修复方案

你的RPN计算程序处理复杂表达式出错,核心原因是栈的类型不匹配,以及数值存储与读取的逻辑错误。

具体问题点

  1. 栈存储类型错误:你用char stack[STACK_SIZE]存储操作数,但实际需要存储的是整数数值,而非字符的ASCII码。
    • 输入数字'8'时,你push的是ASCII值56;但运算后比如计算4-5得到-1,直接把整数-1存入char栈,存储的是对应ASCII字符,最后输出时直接取stack[0]作为整数,完全偏离正确数值。
  2. 运算结果存储逻辑错误:即使强行用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:05:20