A29397. 简单计算器
填空题
困难
知识点
题目描述
简单计算器
题目描述
本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。计算器由两个堆栈组成,一个堆栈 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
/ * - +样例2:
5
2 5 8 4 4
* / - +样例输出
样例1:
2样例2:
ERROR: 5/0参考答案
#include <iostream>
#include <stack>
using namespace std;
int main() {
int N;
cin >> N;
// 初始化数字栈S1,按输入顺序压入数字
stack<int> S1;
for (int i = 0; i < N; ++i) {
int num;
cin >> num;
S1.push(num);
}
// 初始化运算符栈S2,按输入顺序压入运算符
stack<char> S2;
for (int i = 0; i < N - 1; ++i) {
char op;
cin >> op;
S2.push(op);
}
// 执行计算逻辑
while (!S2.empty()) {
// 弹出两个数字:先弹的是n1,后弹的是n2
int n1 = S1.top();
S1.pop();
int n2 = S1.top();
S1.pop();
// 弹出运算符
char op = S2.top();
S2.pop();
int res;
switch (op) {
case '+':
res = n2 + n1;
break;
case '-':
res = n2 - n1;
break;
case '*':
res = n2 * n1;
break;
case '/':
// 处理除法分母为0的异常
if (n1 == 0) {
cout << "ERROR: " << n2 << "/0" << endl;
return 0; // 终止程序
}
res = n2 / n1; // 整数除法,自动取整
break;
default:
res = 0; // 题目保证仅四种运算符,此处为兜底
}
// 计算结果压回数字栈
S1.push(res);
}
// 输出最终结果
cout << S1.top() << endl;
return 0;
}
上一题
下一题