PTA L2-033 简单计算器

题目重现:

cal.jpg

本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1​ 存放数字,另一个堆栈 S2​ 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就执行以下操作:

  1. 从 S1​ 中弹出两个数字,顺序为 n1​ 和 n2​;
  2. 从 S2​ 中弹出一个运算符 op;
  3. 执行计算 n2​ op n1​;
  4. 将得到的结果压回 S1​。

直到两个堆栈都为空时,计算结束,最后的结果将显示在屏幕上。

输入格式:

输入首先在第一行给出正整数 N(1<N≤103),为 S1​ 中数字的个数。

第二行给出 N 个绝对值不超过 100 的整数;第三行给出 N−1 个运算符 —— 这里仅考虑 +-*/ 这四种运算。一行中的数字和符号都以空格分隔。

输出格式:

将输入的数字和运算符按给定顺序分别压入堆栈 S1​ 和 S2​,将执行计算的最后结果输出。注意所有的计算都只取结果的整数部分。题目保证计算的中间和最后结果的绝对值都不超过 109。

如果执行除法时出现分母为零的非法操作,则在一行中输出:ERROR: X/0,其中 X 是当时的分子。然后结束程序。

输入样例 1:

5
40 5 8 3 2
/ * - +

输出样例 1:

2

输入样例 2:

5
2 5 8 4 4
* / - +

输出样例 2:

ERROR: 5/0

题目引用自团体程序设计天梯赛真题(2020年)。

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

实现思路:

  • 当数值栈 a 的大小大于1时,持续执行计算过程。
  • 从数值栈 a 中弹出顶部的两个数值 n1 和 n2
  • 从运算符栈 b 中弹出顶部的运算符 op
  • 根据 op 的类型,执行相应的数学运算(加、减、乘、除),并将结果存储在变量 sum 中。
  • 注意,在做除法时,检查除数 n1 是否为0,防止除零错误。
  • 将计算得到的结果 sum 压入数值栈 a

关键代码:

    while(a.size()>1){
        n1=a.top();
    a.pop();
    n2=a.top();
    a.pop();
    op=b.top();
    b.pop();
    if(op=='+'){
        sum=n1+n2;
    }
    else if(op=='-'){
        sum=n2-n1;
    }
    else if(op=='*'){
        sum=n1*n2;
    }
    else if(op=='/'){
        if(n1==0){
            cout<<"ERROR: "<<n2<<"/0";
            return 0;
        }
        sum=n2/n1;
    }
    a.push(sum);
    }

通过截图:

完整代码:

#include<iostream>
#include<stack>
using namespace std;

int main() {
    stack<int> a;
    stack<char> b;
    int n,x,n1,n2,sum;
    char c,op;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>x;
        a.push(x);
    }
    for(int i=0;i<n-1;i++)
    {
        cin>>c;
        b.push(c);
    }
    while(a.size()>1){
        n1=a.top();
    a.pop();
    n2=a.top();
    a.pop();
    op=b.top();
    b.pop();
    if(op=='+'){
        sum=n1+n2;
    }
    else if(op=='-'){
        sum=n2-n1;
    }
    else if(op=='*'){
        sum=n1*n2;
    }
    else if(op=='/'){
        if(n1==0){
            cout<<"ERROR: "<<n2<<"/0";
            return 0;
        }
        sum=n2/n1;
    }
    a.push(sum);
    }
    cout<<a.top();
    return 0;
}

 

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值