L2-033 简单计算器 (25 分)

该博客介绍了一个为初学者设计的基于堆栈的简单计算器,它有两个堆栈,一个用于存放数字,一个用于存放运算符。当按下等号键时,计算器从堆栈中取出数字和运算符进行计算,并将结果压回数字堆栈,直至所有元素处理完毕。程序会处理加减乘除四种运算,并在除法时检查分母是否为零,遇到0除错误则输出错误信息并结束程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S
​1
​​ 存放数字,另一个堆栈 S
​2
​​ 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就执行以下操作:

从 S
​1
​​ 中弹出两个数字,顺序为 n
​1
​​ 和 n
​2
​​ ;
从 S
​2
​​ 中弹出一个运算符 op;
执行计算 n
​2
​​ op n
​1
​​ ;
将得到的结果压回 S
​1
​​ 。
直到两个堆栈都为空时,计算结束,最后的结果将显示在屏幕上。

输入格式:
输入首先在第一行给出正整数 N(1<N≤10
​3
​​ ),为 S
​1
​​ 中数字的个数。

第二行给出 N 个绝对值不超过 100 的整数;第三行给出 N−1 个运算符 —— 这里仅考虑 +、-、*、/ 这四种运算。一行中的数字和符号都以空格分隔。

输出格式:
将输入的数字和运算符按给定顺序分别压入堆栈 S
​1
​​ 和 S
​2
​​ ,将执行计算的最后结果输出。注意所有的计算都只取结果的整数部分。题目保证计算的中间和最后结果的绝对值都不超过 10
​9
​​ 。

如果执行除法时出现分母为零的非法操作,则在一行中输出:ERROR: X/0,其中 X 是当时的分子。然后结束程序。

输入样例 1:
5
40 5 8 3 2
/ * - +
输出样例 1:
2
输入样例 2:
5
2 5 8 4 4

  • / - +
    输出样例 2:
    ERROR: 5/0
#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<vector>
#include<stack>
using namespace std;

int main() {
	stack<int> s1;
	stack<char> s2;
	int n,n1,n2,sum;
	char op;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int d;
		cin >> d;
		s1.push(d);
	}
	for (int i = 1; i < n; i++) {
		char d;
		cin >> d;
		s2.push(d);
	}
	while (!s1.empty() && !s2.empty()) {
		n1 = s1.top();
		s1.pop();
		n2 = s1.top();
		s1.pop();
		op = s2.top();
		s2.pop();
		if (op == '+') {
			sum = n1 + n2;
		}
		else if (op == '-') {
			sum = n2 - n1;
		}
		else if (op == '*') {
			sum = n2 * n1;
		}
		else {
			if (n1 == 0) {
				cout << "ERROR: " << n2 << "/0" << endl;
				return 0;
			}
			else {
				sum = n2 / n1;
			}
		}
		s1.push(sum);
	}
	cout << s1.top() << endl;
	return 0;
}

### L2-033 简单计算器 实现与解析 #### 题目概述 题目要求处理一系列算术表达式的计算。输入的第一行为测试用例数量N,第二行提供N个绝对值不超过100的整数;第三行则包含N−1个运算符——这里只涉及加法`+`、减法`-`、乘法`*`以及除法`/`这四种基本操作[^2]。 #### 输入格式说明 每组数据为三部- 测试案例总数; - 整数组成的一行字符串,各数值间通过空格隔; - 运算符组成的另一行字符串,同样以空格作为间隔。 #### 输出需求析 对于每一个给定的算术表达式,程序应当按照标准数学规则执行相应的四则运算,并输出最终的结果。值得注意的是,在遇到除法时应特别注意处理可能存在的零除异常情况。 #### Python实现方案 下面是一个基于上述描述编写的Python解决方案: ```python def calculate(expression): numbers = list(map(int, expression[&#39;numbers&#39;].split())) operators = expression[&#39;operators&#39;].split() result = numbers[0] for i in range(len(operators)): operator = operators[i] next_number = numbers[i + 1] try: if operator == &#39;+&#39;: result += next_number elif operator == &#39;-&#39;: result -= next_number elif operator == &#39;*&#39;: result *= next_number elif operator == &#39;/&#39;: # 处理除法可能出现的ZeroDivisionError result /= next_number except ZeroDivisionError as e: print(f"Error: Division by zero encountered.") break return round(result) # 假设读取了如下形式的数据结构 test_cases = [ { &#39;numbers&#39;: "3 5 7", &#39;operators&#39;: "+ *" }, # 更多测试样例... ] for case in test_cases: output = calculate(case) print(output) ``` 此代码片段定义了一个名为`calculate()`的功能函数来接收字典类型的参数,其中包含了待求解的具体实例信息。该算法遍历所有的操作数并依据对应的运算符完成累加、相减、相乘或是相除的动作。当碰到非法的操作(比如被零除),会捕获到异常并向用户报告错误消息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值