CCF计算机软件能力认证试题:201903-2 二十四点

在这里插入图片描述
解题思路:

利用简单的栈操作将中缀表达式转换为后缀表达式,再利用后缀表达式求出值
要求的判定Yes,No是在处理单个字符串后得到的后缀表达式经判断结果直接给出

测试结果:

#include<iostream>
#include<stdlib.h>
#include<vector>
#include<string>
using namespace std;
#define TAL 100

/*
	后缀表达式求值
*/
int HouZhuiRes(string target) {
	string::iterator targB;
	int num[TAL];
	int top = -1;
	for (targB = begin(target); targB != end(target); ++targB) {
		if (*targB >= '0'&&*targB <= '9') {//数字入栈
			num[++top] = *targB - '0';
		}
		else {//符号运算
			int n = num[top--];
			int m = num[top--];
			switch (*targB) {
			case '+':
				num[++top] = m + n;
				break;
			case '-':
				num[++top] = m - n;
				break;
			case 'x':
				num[++top] = m * n;
				break;
			case '/':
				num[++top] = m / n;
				break;
			}
		}
	}
	return num[top];
}

/*
生成后缀表达式
*/
void ConstructHouZhui(vector<string> src) {
	string targ;//targ存储后缀表达式
	char op[TAL];//模拟操作符的栈
	int top = -1;//初始化栈顶
	/*
		假定+ - 的优先级1,* /优先级为2
		当扫描到+或-时op入栈一个1,为*或/时入栈一个2
	*/
	//扫描src
	string::iterator BegA;
	for (string str : src) {
		for (BegA = begin(str); BegA != end(str); ++BegA) {
			if (*BegA >= '0'&&*BegA <= '9')//若为数字直接加入后缀表达式
				targ += *BegA;
			else {//否则处理运算符
				if (*BegA == '+' || *BegA == '-') {
					if (-1 == top) {
						op[++top] = *BegA;
					}
					else {
						if (op[top] == '+' || op[top] == '-') {//小于等于出栈
							while (top > -1 && (op[top] == '+' || op[top] == '-')) {
								targ += op[top--];//栈顶元素出栈
							}
							op[++top] = *BegA;
						}
					}
				}
				if (*BegA == 'x' || *BegA == '/') {
					if (-1 == top) {
						op[++top] = *BegA;
					}
					else {
						if (op[top] == '+' || op[top] == '-') {//大于入栈
							op[++top] = *BegA;
						}
						else {//情况为栈顶为*或/为同优先级出栈
							while (top > -1 && (op[top] == 'x' || op[top] == '/')) {
								targ += op[top--];//栈顶元素出栈
							}
							op[++top] = *BegA;
						}
					}
				}
			}
		}
		while (top > -1) {
			targ += op[top--];
		}
		if (24 == HouZhuiRes(targ)) {
			cout << "Yes"<<endl;
		}
		else {
			cout << "No"<<endl;
		}
	}
}

int main(void) {
	/*
	利用后缀表达式求值,简单模拟    中缀->后缀 运算符大于入栈,小于等于出栈
	*/
	int num;//表达式个数
	vector<string> src;//中缀表达式
	int i;
	/*
	输入处理串
	*/
	cout << "输入字符串个数" << endl;
	cin >> num;
	for (i = 0; i < num;++i) {
		char str[TAL];
		cin >> str;
		//getline(cin, temp);//对于cin输入string
		src.push_back(string{str});
	}
	/*
		targ中存储着后缀表达式
	*/
	ConstructHouZhui(src);
	system("pause");
	return 0;
}

存在问题:

1,考试系统依旧编译出错,但自己的vs2017完全没问题
2,输入字符串时使用getline(cin,目标)会出现错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值