任务描述

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

相关知识

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

前缀表达式求解

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

例如前缀表达式- * + 3 4 5 6

(1) 从右至左扫描,将6、5、4、3压入堆栈; (2) 遇到+运算符,因此弹出34(注意3为栈顶元素,4为次顶元素),计算出3+4的值,得7,再将7入栈; (3) 接下来是*运算符,因此弹出75,计算出7*5=35,将35入栈; (4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。

编程要求

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

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

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

以下是平台的测试样例:

测试输入:-+1*+2345 预期输出:16

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

//
//  main.cpp
//  step3
//
//  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=s.size()-1;i>=0;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 =(num1+num2);
            s1.push(res);
        }
        else if(s[i]=='-')
        {
            num1 = s1.top();
            s1.pop();
            num2= s1.top();
            s1.pop();
            res =(num1-num2);
            s1.push(res);
        }
        else if(s[i]=='*')
        {
            num1 = s1.top();
            s1.pop();
            num2= s1.top();
            s1.pop();
            res =(num1*num2);
            s1.push(res);
        }
    }
    cout<<s1.top()<<endl;
    /********* End *********/
    
    return 0;
}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐