任务描述
本关任务:熟练掌握STL
模板库中栈stack
的基本操作,并利用栈实现后缀表达式求解。
相关知识
为了完成本关任务,你需要掌握:1.后缀表达式求解。
后缀表达式求解
算法思想:与前缀表达式类似,从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 - 运算符 - 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。
例如后缀表达式3 4 + 5 * 6 -
: (1) 从左至右扫描,将3
和4
压入堆栈; (2) 遇到+运算符,因此弹出4
和3
(注意4
为栈顶元素,3
为次顶元素,注意与前缀表达式做比较),计算出3+4
的值,得7
,再将7
入栈; (3) 将5
入栈; (4) 接下来是*
运算符,因此弹出5
和7
,计算出7*5=35
,将35
入栈; (5) 将6
入栈; (6) 最后是-
运算符,计算出35-6
的值,即29
,由此得出最终结果。
编程要求
本关的编程任务是补全右侧代码片段main
中Begin
至End
中间的代码,具体要求如下:
- 读取后缀表达式,并基于栈的插入、删除等基本操作实现后缀表达式求解,表达式中所有的操作数为单一的数字:
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;
}