博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

正误问题

这道题我们可以知道一个字符串当中,我们有的子串只包含true,false,or,and,not和空格,(不包含括号和xor),他们的优先级not最大,and其次 ,or最小),同级左边先算,如果逻辑式有误则输出 error。

补充知识

and相当于c++当中的与运算(&&)

or相当于c++当中的或运算(||)

not相当于c++当中的非运算(!)

思路

我们首先判断该字符串是否合理,如果不合理就直接cout<<"error"<<endl;如果合理再继续进行计算,我们可以用两个栈对此进行存储,一个存储true和false,另一个存储and,or,和not,我们可以按照三个运算的优先级排序,如果stack为空,就入栈,否则判断栈顶的优先级<当前字符,否则全部出栈,对此进行计算,算出答案后又压入第一个栈,一直重复。最后输出第一个栈的top就行了。

这题有点像《计算》

计算题解

不懂怎么用栈的可以看


注意

输入字符串的时候要用while(cin>>s);

错误的代码

这个我没有提前判断式子的准确性,字符串没有用while(cin>>s)来输出,而是直接cin>>s,有时候它读不了空格

#include<bits/stdc++.h>
using namespace std;
int main(){
	stack<int>zhi;
	stack<int>op;
	string s;
	cin>>s;
	while(zhi.empty()!=true){
		zhi.pop();
	}
	while(op.empty()!=true){
		op.pop();
	}
	if(s[0]=='t'){
		zhi.push(1);
	}
	if(s[0]=='f'){
		zhi.push(2);
	}
	if(s[0]=='n'){
		op.push(5);
	}
	int ans1,ans2;
	int cz;
	for(int i=1;i<s.size();i++){
		if(s[i]==' '){
			if(s[i+1]=='t'){
				zhi.push(1);
			}
			if(s[i+1]=='f'){
				zhi.push(2);
			}
			if(s[i+1]=='o'){
				if(op.empty()==true){
					op.push(3);
				}
				else{
					while(op.empty()!=true){
						cz=op.top();
						op.pop();
						if(cz==5){
							ans1=zhi.top();
							zhi.pop();
							ans2=zhi.top();
							zhi.pop();
							if(ans1==1||ans2==1){
								zhi.push(1);
							}
							else{
								zhi.push(2);
							}
						}
						if(cz==4){
							ans1=zhi.top();
							zhi.pop();
							ans2=zhi.top();
							zhi.pop();
							if(ans1==1&&ans2==1){
								zhi.push(1);
							}
							else{
								zhi.push(2);
							}
						}
						if(cz==3){
							ans1=zhi.top();
							zhi.pop();
							if(ans1==1){
								zhi.push(2);
							}
							else{
								zhi.push(1);
							}
						}
					}
				}
			}
			else if(s[i+1]=='a'){
				if(op.empty()==true||op.top()==3){
					op.push(4);
				}
				else{
					while(op.empty()!=true){
						cz=op.top();
						op.pop();
						if(cz==5){
							ans1=zhi.top();
							zhi.pop();
							ans2=zhi.top();
							zhi.pop();
							if(ans1==1||ans2==1){
								zhi.push(1);
							}
							else{
								zhi.push(2);
							}
						}
						if(cz==4){
							ans1=zhi.top();
							zhi.pop();
							ans2=zhi.top();
							zhi.pop();
							if(ans1==1&&ans2==1){
								zhi.push(1);
							}
							else{
								zhi.push(2);
							}
						}
						if(cz==3){
							ans1=zhi.top();
							zhi.pop();
							if(ans1==1){
								zhi.push(2);
							}
							else{
								zhi.push(1);
							}
						}
					}
				}
			}
			else if(s[i+1]=='n'){
				if(op.empty()==true||op.top()!=5){
					op.push(5);
				}
				else{
					while(op.empty()!=true){
						cz=op.top();
						op.pop();
						if(cz==5){
							ans1=zhi.top();
							zhi.pop();
							ans2=zhi.top();
							zhi.pop();
							if(ans1==1||ans2==1){
								zhi.push(1);
							}
							else{
								zhi.push(2);
							}
						}
						if(cz==4){
							ans1=zhi.top();
							zhi.pop();
							ans2=zhi.top();
							zhi.pop();
							if(ans1==1&&ans2==1){
								zhi.push(1);
							}
							else{
								zhi.push(2);
							}
						}
						if(cz==3){
							ans1=zhi.top();
							zhi.pop();
							if(ans1==1){
								zhi.push(2);
							}
							else{
								zhi.push(1);
							}
						}
					}
				}
			}
		}
	}
	if(op.empty()!=true){
		while(op.empty()!=true){
			cz=op.top();
			op.pop();
			if(cz==3){
				if(zhi.size()>=2){
					ans1=zhi.top();
					zhi.pop();
					ans2=zhi.top();
					zhi.pop();
					if(ans1==1||ans2==1){
						zhi.push(1);
					}
					else{
						zhi.push(2);
					}
				}
				else{
					cout<<"error"<<endl;
					return 0;
				}
			}
			if(cz==4){
				if(zhi.size()>=2){
					ans1=zhi.top();
					zhi.pop();
					ans2=zhi.top();
					zhi.pop();
					if(ans1==1&&ans2==1){
						zhi.push(1);
					}
					else{
						zhi.push(2);
					}
				}
				else{
					cout<<"error"<<endl;
					return 0;
				}
			}
			if(cz==5){
				if(zhi.size()>=1){
					ans1=zhi.top();
					zhi.pop();
					if(ans1==1){
						zhi.push(2);
					}
					else{
						zhi.push(1);
					}
				}
				else{
					cout<<"error"<<endl;
					return 0;
				}
			}
		}
	}
	if(zhi.size()==1){
		if(zhi.top()==1){
			cout<<"true"<<endl;
		}
		else{
			cout<<"false"<<endl;
		}
	}
	else{
		cout<<"error"<<endl;
	}
	return 0;
}

AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	stack<int>zhi;
	stack<int>op;
	string s;
	while(zhi.empty()!=true){
		zhi.pop();
	}
	while(op.empty()!=true){
		op.pop();
	}
	int ans1,ans2;
	int cz;
	int pd=2;
	while(cin>>s){
		if(s[0]=='n'){
			if(pd!=1){
				pd=2;
			}
			else{
				cout<<"error"<<endl;
				return 0;
			}
		}
		if(s[0]=='t'||s[0]=='f'){
			if(pd!=1)pd=1;
			else{
				cout<<"error"<<endl;
				return 0;
			}
		}
		if(s[0]=='o'||s[0]=='a'){
			if(pd==1)pd=0;
			else{
				cout<<"error"<<endl;
				return 0;
			}
		}
		if(s[0]=='t'){
			zhi.push(1);
		}
		if(s[0]=='f'){
			zhi.push(2);
		}
		if(s[0]=='o'){
			if(op.empty()==true){
				op.push(3);
			}
			else{
				while(op.empty()!=true){
					cz=op.top();
					op.pop();
					if(cz==3){
						ans1=zhi.top();
						zhi.pop();
						ans2=zhi.top();
						zhi.pop();
						if(ans1==1||ans2==1){
							zhi.push(1);
						}
						else{
							zhi.push(2);
						}
					}
					if(cz==4){
						ans1=zhi.top();
						zhi.pop();
						ans2=zhi.top();
						zhi.pop();
						if(ans1==1&&ans2==1){
							zhi.push(1);
						}
						else{
							zhi.push(2);
						}
					}
					if(cz==5){
						ans1=zhi.top();
						zhi.pop();
						if(ans1==1){
							zhi.push(2);
						}
						else{
							zhi.push(1);
						}
					}
				}
			}
		}
		else if(s[0]=='a'){
			if(op.empty()==true||op.top()==3){
				op.push(4);
			}
			else{
				while(op.empty()!=true){
					cz=op.top();
					op.pop();
					if(cz==3){
						ans1=zhi.top();
						zhi.pop();
						ans2=zhi.top();
						zhi.pop();
						if(ans1==1||ans2==1){
							zhi.push(1);
						}
						else{
							zhi.push(2);
						}
					}
					if(cz==4){
						ans1=zhi.top();
						zhi.pop();
						ans2=zhi.top();
						zhi.pop();
						if(ans1==1&&ans2==1){
							zhi.push(1);
						}
						else{
							zhi.push(2);
						}
					}
					if(cz==5){
						ans1=zhi.top();
						zhi.pop();
						if(ans1==1){
							zhi.push(2);
						}
						else{
							zhi.push(1);
						}
					}
				}
			}
		}
		else if(s[0]=='n'){
			if(op.empty()==true||op.top()!=5){
				op.push(5);
			}
			else if(op.top()==5){
				op.pop();
			}
			else{
				while(op.empty()!=true){
					cz=op.top();
					op.pop();
					if(cz==3){
						ans1=zhi.top();
						zhi.pop();
						ans2=zhi.top();
						zhi.pop();
						if(ans1==1||ans2==1){
							zhi.push(1);
						}
						else{
							zhi.push(2);
						}
					}
					if(cz==4){
						ans1=zhi.top();
						zhi.pop();
						ans2=zhi.top();
						zhi.pop();
						if(ans1==1&&ans2==1){
							zhi.push(1);
						}
						else{
							zhi.push(2);
						}
					}
					if(cz==5){
						ans1=zhi.top();
						zhi.pop();
						if(ans1==1){
							zhi.push(2);
						}
						else{
							zhi.push(1);
						}
					}
				}
			}
		}
	}
	if(op.empty()!=true){
		while(op.empty()!=true){
			cz=op.top();
			op.pop();
			if(cz==3){
				ans1=zhi.top();
				zhi.pop();
				ans2=zhi.top();
				zhi.pop();
				if(ans1==1||ans2==1){
					zhi.push(1);
				}
				else{
					zhi.push(2);
				}
			}
			if(cz==4){
				ans1=zhi.top();
				zhi.pop();
				ans2=zhi.top();
				zhi.pop();
				if(ans1==1&&ans2==1){
					zhi.push(1);
				}
				else{
					zhi.push(2);
				}
			}
			if(cz==5){
				ans1=zhi.top();
				zhi.pop();
				if(ans1==1){
					zhi.push(2);
				}
				else{
					zhi.push(1);
				}
			}
		}
	}
	if(zhi.top()==1){
		cout<<"true"<<endl;
	}
	else{
		cout<<"false"<<endl;
	}
	return 0;
}
posted @ 2020-06-17 11:38  5656566  阅读(114)  评论(0)    收藏  举报