CCF-CSP备考记录:201903-2 二十四点

CCF-CSP备考记录:201903-2 二十四点

题目

在这里插入图片描述
在这里插入图片描述

题目分析

本题目是对算术表达式的处理。
首先,把读取的中缀表达式转化为后缀表达式(方便后期计算处理):

  1. 如果是数字,直接加入后缀表达式末尾;
  2. 如果是操作符:若符号栈空,直接压入栈中;若栈不空,比较栈顶元素和此操作符的优先级, 若栈顶元素优先级高,则弹出栈顶,加入后缀表达式末尾,重复操作,直到不满足栈顶元素优先级高或栈空。把栈外操作符压入栈中。
  3. 表达式读取完后,若符号栈非空,依次弹出栈内元素,加入后缀表达式末尾。

然后,读取后缀表达式计算:

  1. 若是数字,压入数字栈中;
  2. 若是操作符,从数字栈中弹出两个数字(第一个为右操作数,第二个左操作数),计算,把结果压入数字栈。

最后数字栈底的数字即为最终结果。
比较结果是否为24,在标志数组中记录。

100分c++代码:

#include <iostream>
#include<string>
#include<stack>
using namespace std; 
#define N 101 

bool judge_op(char ch){//判断是否为运算符 
	if((ch=='+')||(ch=='-')||(ch=='x')||(ch=='/'))return true;
	return false;
}
int priority(char ch){//返回优先级 
	if((ch=='+')||(ch=='-'))return 1;
	if((ch=='x')||(ch=='/'))return 5;
	return 0;
} 
int calc(int l,char ch,int r){//计算 
	if(ch=='+')return l+r; 
	if(ch=='-')return l-r;
	if(ch=='x')return l*r;
	if(ch=='/')return l/r;
}

int main(int argc, char** argv) {
	int n,res[N]={0};
	stack<int>num; //数栈 
	stack<char>oper; //符号栈 
	cin>>n;
	for(int i=0;i<n;i++){
		string func,back_func;//表达式,后缀表达式 
		cin>>func;
		//变为后缀表达式 
		for(int j=0;j<7;j++){
			char a=func[j];
			if(judge_op(a)){ //是字符串 
				if(oper.empty())oper.push(a);
				else{
					char tmp=oper.top();
					while(priority(tmp)>=priority(a)){
						oper.pop();//获取栈顶
						//back_func.push_back(tmp); 
						back_func+=tmp;
						if(!oper.empty()) tmp=oper.top();
						else break;
					}
					oper.push(a);//入栈 		
				}
			}
			else back_func+=func[j];
		}
		while(!oper.empty()){
			back_func+=oper.top();
			oper.pop();
		}
		//计算后缀表达式 
		int l,r,re;
		for(int j=0;j<7;j++){
			char a=back_func[j];
			if(!judge_op(a)){//是数字
				num.push(a-'0'); 
			}
			else{
				r=num.top();num.pop();
				l=num.top();num.pop();
				re=calc(l,a,r);
				num.push(re);
			}
		}
		re=num.top();num.pop();
		if(re==24)res[i]=1;
	}
	for(int i=0;i<n;i++){
		if(res[i])cout<<"Yes";
		else cout<<"No";
		if(i!=n-1)cout<<'\n';
	}
	return 0;
}

THE END!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值