第3关:STL模板之栈stack实例:计算机求解前缀表达式
·
任务描述
本关任务:熟练掌握STL模板库中栈stack的基本操作,并利用栈实现前缀表达式求解。
相关知识
为了完成本关任务,你需要掌握:1.前缀表达式求解。
前缀表达式求解
算法思想:从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 - 运算符 - 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。可见用计算机计算前缀表达式的值是非常容易的。
例如前缀表达式- * + 3 4 5 6:
(1) 从右至左扫描,将6、5、4、3压入堆栈; (2) 遇到+运算符,因此弹出3和4(注意3为栈顶元素,4为次顶元素),计算出3+4的值,得7,再将7入栈; (3) 接下来是*运算符,因此弹出7和5,计算出7*5=35,将35入栈; (4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。
编程要求
本关的编程任务是补全右侧代码片段main中Begin至End中间的代码,具体要求如下:
- 读取前缀表达式,并基于栈的插入、删除等基本操作实现前缀表达式求解,表达式中所有的操作数为单一的数字:
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;
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)