第4关:STL模板之栈stack实例:计算机求解后缀表达式


任务描述

本关任务:熟练掌握STL模板库中栈stack的基本操作,并利用栈实现后缀表达式求解。

相关知识

为了完成本关任务,你需要掌握:1.后缀表达式求解。

后缀表达式求解

算法思想:与前缀表达式类似,从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 - 运算符 - 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。

例如后缀表达式3 4 + 5 * 6 -: (1) 从左至右扫描,将34压入堆栈; (2) 遇到+运算符,因此弹出43(注意4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈; (3) 将5入栈; (4) 接下来是*运算符,因此弹出57,计算出7*5=35,将35入栈; (5) 将6入栈; (6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。

编程要求

本关的编程任务是补全右侧代码片段mainBeginEnd中间的代码,具体要求如下:

  • 读取后缀表达式,并基于栈的插入、删除等基本操作实现后缀表达式求解,表达式中所有的操作数为单一的数字:0~9,运算符仅包含:+ - * ( )
测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:123+4*+5- 预期输出:16

输入格式:后缀表达式 输出格式:运算结果,末尾换行\n

//
//  main.cpp
//  step4
//
//  Created by ljpc on 2018/8/31.
//  Copyright © 2018年 ljpc. All rights reserved.
//

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

int main(int argc, const char * argv[]) {
   
    // 请在这里补充代码,完成本关任务
    /********* Begin *********/
    string s;
    stack<int> s1;
    cin >> s;
    int num1,num2;
    int res;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]<='9' && s[i]>='0')
        {
            s1.push(s[i]-'0');
        }
        else if(s[i]=='+')
        {
           num1 = s1.top();
            s1.pop();
            num2= s1.top();
            s1.pop();
            res =(num2+num1);
            s1.push(res);
        }
        else if(s[i]=='-')
        {
            num1 = s1.top();
            s1.pop();
            num2= s1.top();
            s1.pop();
            res =(num2-num1);
            s1.push(res);
        }
        else if(s[i]=='*')
        {
            num1 = s1.top();
            s1.pop();
            num2= s1.top();
            s1.pop();
            res =(num2*num1);
            s1.push(res);
        }
    }
    
    printf("%d",res);

    /********* End *********/
 
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值