ccf201903-2二十四点

我与影子孤独终老i 提交于 2019-12-15 13:35:09

这个题学了数据结构之后其实非常简单。

就一个运算符栈digit,一个操作符栈op.

那么逻辑是,如果是数字,直接进数字栈。

如果是操作符

       如果栈顶优先级高于当前操作符。那么先让digit栈的栈顶两元素做当前运算。然后op栈顶弹出,直到栈顶元素的优先级小于当前的操作符,所以这里需要加上一个循环。而不是简单的一个if

 然后就很简单了,思路指导代码。我这个代码写的有点不是很好看,凑合看吧。另外有个要注意的地方就是,这里的那个*不是* 而是x。

在这里我简单介绍一下我的函数preceed,这个是判断优先级的函数,第一参数表示栈顶操作符,第二参数表示当前操作符。

细心的注意到了这里最开始的时候s+='#'.

而且操作符栈op.push('#').

如果是最后一个怎么判断它已经完了呢?如果是栈底第一个怎么判断它的优先级呢?就靠这个#来进行标识,栈里的#优先级是最低的。这个,害,好像不是很好描述。就编译原理里面也有这种思想。自己模拟一下就能够理解了,我觉得干这种事不应该着急着打代码的,,而是先模拟一下过程清楚思路

#include<iostream>
#include<stack>
#include<algorithm> 
using namespace std;
char preceed(char a,char b);
int main()
{
	string s;
	int n;
	cin>>n;
	stack<int > digit;
	stack<char > op;
	while(cin>>s){
		s+="#";
		op.push('#');
		for(int i=0;i<s.length();i++){
			if(s[i] <= '9' && s[i] >= '0'){
				digit.push(s[i]-'0');
			}else {
				int down,up;
				if(preceed(op.top(),s[i]) == '<'){
					op.push(s[i]);
				}else {
				
					while(preceed(op.top(),s[i]) == '>'){
						if(op.top() == '+'){
							up = digit.top();
							digit.pop();
							down = digit.top();
							digit.pop();
							digit.push(up+down);
						}else if(op.top() == '-'){
							up = digit.top();
							digit.pop();
							down = digit.top();
							digit.pop();
							digit.push(down-up);
						}else if(op.top() == 'x'){
							up = digit.top();
							digit.pop();
							down = digit.top();
							digit.pop();
							digit.push(down*up);
						}else if(op.top() == '/'){
							up = digit.top();
							digit.pop();
							down = digit.top();
							digit.pop();
							digit.push(down/up);
						}
						op.pop();
					}
					op.push(s[i]);
				}
			}
		}
		
		if(!digit.empty() && digit.top() == 24){
			printf("Yes\n");
		}else{
			printf("No\n");
		}
		
	}
	return 0;
} 
char preceed(char a,char b){
	switch (a){
		case '#':
			if(b == '#') return '=';
			return '<';
		case '+':
		case '-':
			switch (b){
				case '+':
				case '-':
				case '#':
					return '>';
				case 'x':
				case '/':
					return '<';
			}
		case 'x':
		case '/':
			return '>';
	}
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!