viency13 2023-06-08 14:15 采纳率: 68.8%
浏览 50
已结题

有一个测试点 运算符和操作数接近最大值 过不去,答案错误是为什么呢

7-5 逆波兰表达式求值
分数 8
作者 李廷元
单位 中国民用航空飞行学院
逆波兰表示法是一种将运算符(operator)写在操作数(operand)后面的描述程序(算式)的方法。举个例子,我们平常用中缀表示法描述的算式(1 + 2)*(5 + 4),改为逆波兰表示法之后则是1 2 + 5 4 + *。相较于中缀表示法,逆波兰表示法的优势在于不需要括号。

请输出以逆波兰表示法输入的算式的计算结果。

输入格式:
在一行中输入1个算式。相邻的符号(操作数或运算符)用1个空格隔开。

输出格式:
在一行中输出计算结果。

限制:
2≤算式中操作数的总数≤100

1≤算式中运算符的总数≤99

运算符仅包括“+”、“-”、“*”,操作数、计算过程中的值以及最终的计算结果均在int范围内。

输入样例1:
4 3 + 2 -
输出样例1:
5
输入样例2:
1 2 + 3 4 - *
输出样例2:
-3


```c++
#include <iostream>
#include <stdio.h>
using namespace std;

typedef struct
{
    int *top;
    int *base;
}Stack;

void init ( Stack &S )
{
    S.base = new int[1000];
    S.top = S.base;
}

void push ( Stack &S, int x )
{
    *S.top++ = x;
}

int pop ( Stack &S )
{
    int x;
    x = * --S.top;
    return x;
}

int main ()
{
    Stack S;
    init (S);
    char c;
    int num = 0;
    while ( scanf ("%c ", &c) != EOF )
    {
        int x;
        if ( c == '+' || c == '-' || c == '*' )
        {
            num = 0;
            int x1, x2;
            x1 = pop (S);
            x2 = pop (S);
            if ( c == '+' )
            {
                num = x1 + x2;
            }
            if ( c == '-' )
            {
                num = x2 - x1;
            }
            if ( c == '*' )
            {
                num = x1 * x2;
            }
            push (S, num);
        }
        else
        {
            x = c - '0';
            push (S, x);
        }
    }
    cout << num;
    return 0;
}


```

  • 写回答

2条回答 默认 最新

  • 喝茶品人生 2023-06-08 14:38
    关注

    调试好的代码:

    img

    #include <iostream>
    #include <stack>
    #include <string>
    using namespace std;
    
    int main() {
        string s;
        stack<int> nums; 
        int num = 0; 
    
        getline(cin, s); 
    
        for (char c : s) { 
            if (isdigit(c)) { 
                num = num * 10 + (c - '0'); 
            } else if (c == ' ') { 
                if (num != 0) { 
                    nums.push(num);
                    num = 0; 
                }
            } else { 
                int a = nums.top(); 
                nums.pop(); 
                int b = nums.top(); 
                nums.pop(); 
    
                int res = 0; 
                if (c == '+') { 
                    res = b + a;
                } else if (c == '-') { 
                    res = b - a;
                } else if (c == '*') { 
                    res = b * a;
                }
                nums.push(res);
            }
        }
    
        cout << nums.top() << endl; 
    
        return 0;
    }
    
    
    
    本回答被题主和专家选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月20日
  • 已采纳回答 6月12日
  • 专家已采纳回答 6月12日
  • 创建了问题 6月8日

悬赏问题

  • ¥15 在matlab中Application Compiler后的软件无法打开
  • ¥15 想问一下STM32创建工程模板时遇到得问题
  • ¥15 Fiddler抓包443
  • ¥20 Qt Quick Android 项目报错及显示问题
  • ¥15 而且都没有 OpenCVConfig.cmake文件我是不是需要安装opencv,如何解决?
  • ¥15 oracleBIEE analytics
  • ¥15 H.264选择性加密例程
  • ¥50 windows的SFTP服务器如何能批量同步用户信息?
  • ¥15 centos7.9升级python3.0的问题
  • ¥15 安装CentOS6时卡住