正误问题
这道题我们可以知道一个字符串当中,我们有的子串只包含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;
}
浙公网安备 33010602011771号