1. 程式人生 > 實用技巧 >L2-1 簡單計算器 (25分)_2020年團體程式設計天梯賽-總決賽

L2-1 簡單計算器 (25分)_2020年團體程式設計天梯賽-總決賽

L2-1 簡單計算器 (25分)

本題要求你為初學資料結構的小夥伴設計一款簡單的利用堆疊執行的計算器。如上圖所示,計算器由兩個堆疊組成,一個堆疊 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

程式碼:

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<iostream>
 3 #include<string>
 4 #include<cmath>
 5 #include<cstdlib>
 6 #include<algorithm>
 7 #include<stack>
 8 using namespace std;
 9 int main() {
10     stack<int> s1;
11     stack<char
> s2; 12 int n = 0; 13 cin >> n; 14 for (int i = 0; i < n; i++) { 15 int a; 16 cin >> a; 17 s1.push(a); 18 } 19 for (int i = 0; i < n - 1; i++) { 20 char a; 21 cin >> a; 22 s2.push(a); 23 } 24 int res = 0; 25 res += s1.top(); 26 s1.pop(); 27 while (!s1.empty()) { 28 if (s2.top() == '+') { 29 res += s1.top(); 30 s1.pop(); 31 s2.pop(); 32 } 33 else if (s2.top() == '-') { 34 res = s1.top() - res; 35 s1.pop(); 36 s2.pop(); 37 } 38 else if (s2.top() == '*') { 39 res *= s1.top(); 40 s1.pop(); 41 s2.pop(); 42 } 43 else if (s2.top() == '/') { 44 if (res == 0) { 45 cout << "ERROR: " << s1.top() << "/"; 46 break; 47 } 48 res = s1.top() / res; 49 s1.pop(); 50 s2.pop(); 51 } 52 } 53 cout << res << endl; 54 return 0; 55 }