CCF 201903-2 二十四點 用棧模擬簡單計算器

二十四點
來源:CCF
背景
二十四點是一款著名的紙牌遊戲,其遊戲的目標是使用 3 個加減乘除運算使得 4張紙牌上數字的運算結果爲 24。
題目
定義每一個遊戲由 4 個從 1-9 的數字和 3 個四則運算符組成,保證四則運算符將數字兩兩隔開,不存在括號和其他字符,運算順序按照四則運算順序進行。其中加法用符號 + 表示,減法用符號 - 表示,乘法用小寫字母 x 表示,除法用符號 / 表示。在遊戲裏除法爲整除,例如 2 / 3 = 0,3 / 2 = 1, 4 / 2 = 2。
老師給了你 n 個遊戲的解,請你編寫程序驗證每個遊戲的結果是否爲 24 。
輸入
從標準輸入讀入數據。第一行輸入一個整數 n,從第 2 行開始到第 n + 1 行中,每一行包含一個長度爲 7的字符串,爲上述的 24 點遊戲,保證數據格式合法。
輸出
輸出到標準輸出。
包含 n 行,對於每一個遊戲,如果其結果爲 24 則輸出字符串 Yes,否則輸出字符串 No。
輸入樣例
10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5
輸出樣例
Yes
No
No
Yes
Yes
No
No
No
Yes
Yes
樣例解釋
9+3+4 × 3 = 24
5+4 × 5 × 5 = 105
7 − 9 − 9+8= −3
5 × 6/5 × 4 = 24
3 + 5 + 7 + 9 = 24
1 × 1+9 − 9=1
1 × 9 − 5/9 = 9
8/5 + 6 × 9 = 55
6 × 7 − 3 × 6 = 24
6 × 4 + 4/5 = 24
提示
在這裏插入圖片描述

解題思路:
表達式中只含有+、-、x、/ 四種運算,我們可以簡單地用棧來模擬計算。
使用兩個棧,分別是數字棧和操作符號棧,過程是這樣的,順序遍歷表達式,如果遇到的是數字,壓入數字棧,如果遇到的是操作符號,壓入操作符號棧。
由於x、/ 的優先級較高,所以當遇到乘法和除法時,我們可以直接計算結果,然後把計算結果壓入數字棧。
再者,減法的結合性是從左向右的,所以我們可以做一個簡單轉換,將所有的減法變爲加法。當所有的操作符號都被處理過後,數字棧中的數就是結果了。

記憶要點:數字棧與符號棧、優先級高的直接處理、對左結合的減法進行轉換

AC代碼:

#include<iostream>
#include<stack>
#include<stdio.h>
using namespace std;
stack<int> num;
stack<char> s;
int main() {
	int n;
	cin >> n;
	getchar();//吃掉回車
	while (n--) {
		if (!num.empty())num.pop();
		if (!s.empty())s.pop();
		char ch;
		ch = getchar();
		int a, b; char op;
		while (ch != '\n') {
			if (ch >= '0' && ch <= '9') {
				if (!s.empty() && s.top() == '-') {//符號棧頂爲減號 則對減法適當處理
					num.push((ch - '0')*(-1));
				}
				else num.push(ch - '0');
				if (!s.empty() && (s.top() == 'x' || s.top() == '/')) {//乘法和除法則直接計算
					b = num.top(); num.pop();
					a = num.top(); num.pop();
					op = s.top(); s.pop();
					if (op == 'x')num.push(a*b);
					else num.push(a / b);
				}
			}
			else s.push(ch);
			ch = getchar();
		}
		while (!s.empty()) {//對剩下的操作符進行處理 這裏可以全部認爲是加法操作符 
			b = num.top(); num.pop();
			a = num.top(); num.pop();
			s.pop();
			num.push(a + b);
		}
		int tmp = num.top(); num.pop();
		if (tmp == 24)cout << "Yes" << endl;
		else cout << "No" << endl;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章