CCF-CSP真题201903-2《二十四点》(栈)

思路: 

1、初始化两个栈,操作数栈和运算符栈。实现代码中加入的小括号的匹配,注意题目并未要求。

2、若扫描到操作数,压入操作数栈。

3、若遇到小括号‘(’,直接入操作符栈,若遇到小括号‘)’,依次弹出操作符栈内的运算符,并每次弹出操作数栈的栈顶两个元素,计算后重新压入操作数栈,直至遇到小括号‘(’,弹出小括号‘(’。

4、若遇到运算符,依次弹出优先级高于或等于当前运算符的所有运算符,并每次弹出操作数栈的栈顶两个元素,计算后重新压入操作数栈。遇到小括号‘(’停止,之后再把当前运算符入操作符栈。

5、处理完字符串后。将操作符栈中的剩余运算符一次弹出,和上述计算方法一样。

6、最后操作数栈的栈顶元素即为字符串结果。

代码实现: 

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

stack<int>num;      //存放操作数
stack<char>ch;      //存放操作符

//根据操作数和操作符计算并返回
int cal(int a, int b, char op) {
	switch (op) {
	case '+':
		return a + b;
	case '-':
		return a - b;
	case 'x':
		return a * b;
	case '/':
		return a / b;
	}
}

//比较两个操作符的优先级,x1的优先级大于x2则返回0,否则返回1
int comp(char x1, char x2) {
	if ((x1 == 'x' || x1 == '/') && (x2 == '+' || x2 == '-'))
		return 0;
	else
		return 1;
}

//操作函数,取操作数栈的栈顶两元素和操作符的栈顶元素,计算后再入操作数栈
void opera(stack<int>& num, stack<char>& ch) {
	int x1 = num.top();
	num.pop();
	int x2 = num.top();
	num.pop();
	char op = ch.top();
	ch.pop();
	num.push(cal(x2, x1, op));
}
int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		string s;
		cin >> s;
		for (auto& x : s) {
			if (isdigit(x))               //操作数直接入栈
				num.push(x - '0');
			if (x == '(')                 //左括号直接入栈
				ch.push(x);
			if (x == '+' || x == '-' || x == 'x' || x == '/') {            //操作符进行判断
				while (!ch.empty() && ch.top() != '(' && comp(x, ch.top()) == 1) {
					opera(num, ch);
				}
				ch.push(x);
			}
			if (x == ')') {
				while (!ch.empty() && ch.top() != '(') {
					opera(num, ch);
				}
				ch.pop();
			}
		}
		while (!ch.empty()) {           //字符串遍历完后,处理运算符栈中剩余操作符
			opera(num, ch);
		}
		if (num.top() == 24)
		{
			cout << "Yes" << endl;
		}
		else
		{
			cout << "No" << endl;
		}
	}
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用: 这是2020年CSP-J入门单项选择题解析,解析明白,一看就懂。整理不易,文章出错评论区说,看见必改。请一键三连,给个五星好评。小编那么拼,给个赞再撤┗|`O′|┛ 嗷~~。 引用: 子任务中显示测试点2正确个数为0,因此,可以用如下方法,骗到10分。以下是一个C++的代码示例: #include <iostream> using namespace std; int main() { int n; cin >> n; for (int i = 0; i < n; i++) { cout << "No" << endl; } return 0; } 以上代码会输出n个"No",可以通过测试点2并获得10分。 引用: 这是一个使用数组和实现的C++代码示例: #include <iostream> #include <stack> using namespace std; int main() { char a[100]; int n; cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < n; i++) { int num; //运算数 char oper; //运算符 int sum = 0; for (int j = 0; j < 7; j++) { if (j % 2 == 0) num[j / 2] = a[i][j] - 48; //0的ASSIC码为48 else oper[j / 2] = a[i][j]; } stack<int> snum; stack<char> soper; snum.push(num); for (int i = 0; i < 3; i++) { if (oper[i] == 'x' ||oper[i] == '/') { int temp = snum.top(); snum.pop(); if (oper[i] == 'x') snum.push(temp * num[i + 1]); else snum.push(temp / num[i + 1]); } else if (oper[i] == '-') { snum.push(-num[i + 1]); soper.push(oper[i]); } else { snum.push(num[i + 1]); soper.push(oper[i]); } } sum = snum.top(); snum.pop(); for (int i = 0; i < soper.size(); i++) { sum += snum.top(); snum.pop(); } if (sum == 24) cout << "Yes" << endl; else cout << "No" << endl; } } 以上代码实现了一个解析给定算术表达式是否等于24的程序。 问题:请告诉我,csp201903-2是什么? csp201903-2是一个CSP(全国计算机科学与技术专业资格考试)的题目编号,表示该题是2019年3月份的第2道题目。具体题目内容需要查阅相关资料来获取。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [2020年CSP-J入门单项选择题解析](https://download.csdn.net/download/sjy100401/88234366)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [CSP 201903-2 二十四点 (C++)](https://blog.csdn.net/qq_39876147/article/details/117091994)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [CSP201903-2二十四点](https://blog.csdn.net/weixin_43074474/article/details/101128023)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值