天梯赛二阶题——L2-033 简单计算器(25 分)

182 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

题目描述:

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

代码长度限制   16 KB

时间限制     400 ms

内存限制     64 MB

题目难点分析:

毫无疑问,这题考察的是大家对栈的运用,计算器可以说是非常经典的一个代码了,难点在于计算器的创建,和当分母为0的时候,退出的条件

具体步骤:

1.创建两个全局栈,一个用来装操作数,一个装操作符(一定要全局)

2.创建结构体,包含两个int

3.设计计算函数,当分母是0的时候,return一个struct(0,second)

4.主函数的循环条件即当操作符栈不为空时

代码如下:

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

//全局栈
stack<int>a;//操作数
stack<char>b;//操作符

struct shang
{
	int first;
	int second;
	shang(int f, int s) {
		first = f;
		second = s;
	}
};
//一次计算
shang calculate() {
	int first = a.top();
	a.pop();
	int second = a.top();
	a.pop();
	
	char c = b.top();
	b.pop();
	int temp = 0;
	switch (c)
	{
	case '+':
		temp = first + second;
		a.push(temp);
		break;
	case '-':
		temp = second - first;
		a.push(temp);
		break;
	case '*':
		temp = first * second;
		a.push(temp);
		break;
	case '/':
		//终止条件
		if (first == 0) {
			return shang(0, second);
		}
		temp = second / first;
		a.push(temp);
		break;
	}
	return shang(1, second);
}

int main()
{
	int n;
	cin >> n;

	int x;
	char y;
	//将所有的东西入栈
	for (int i = 0; i < n; i++) {
		cin >> x;
		a.push(x);
	}
	for (int i = 0; i < n - 1; i++) {
		cin >> y;
		b.push(y);
	}
	shang index(0, 0);
	while (!b.empty()) {
		index = calculate();
		if (index.first == 0) {
			cout << "ERROR: " << index.second << "/" << "0";
			return 0;
		}
	}
	cout << a.top();
	return 0;
}

解题结束~