给出一个布尔表达式的字符串,比如:true or false and false,表达式只包含true,false,and和or,现在要对这个表达式进行布尔求值,计算结果为真时输出true、为假时输出false,不合法的表达时输出error(比如:true true)。表达式求值是注意and 的优先级比 or 要高,比如:true or false and false,等价于 true or (false and false),计算结果是 true。
给出一个布尔表达式的字符串,比如:true or false and false,表达式只包含true,false,and和or,现在要对这个表达式进行布尔求值,计算结果为真时输出true、为假时输出false,不合法的表达时输出error(比如:true true)。表达式求值是注意and 的优先级比 or 要高,比如:true or false and false,等价于 true or (false and false),计算结果是 true。
输入第一行包含布尔表达式字符串s,s只包含true、false、and、or几个单词(不会出现其它的任何单词),且单词之间用空格分隔。 (1 ≤ |s| ≤ 103).
输出true、false或error,true表示布尔表达式计算为真,false表示布尔表达式计算为假,error表示一个不合法的表达式。
and
error
true and false
false
true or false and false
true
#include<iostream> (720)#include<string> #include<stack> using namespace std; string Reduce(string str1,string str2,string op) { if(op=="and") { if((str1=="true"&& str2=="true")) return "true"; else return "false"; } else//o***bsp; { if(str1=="false"&&str2=="false") return "false"; else return "true"; } } bool Comp(string op1,string op2)//op1:栈外 Op2:栈内 op1>op2 return true { if(op1=="and"&&op2=="or") return true; else return false; } int main()//false&nbs***bsp;true and false&nbs***bsp;true and false { string str; string output; stack <string> S,OP; int count=0; while(cin.peek()!='\n') { cin>>str; if((count%2==0)&&(str=="false"||str=="true")) S.push(str); else if((count%2==1)&&(str=="and"||str=="or"))//op { if(OP.empty()) OP.push(str); else { while(!OP.empty()&&!Comp(str,OP.top())) { string s1,s2,op,output; s1=S.top(); S.pop(); s2=S.top(); S.pop(); op=OP.top(); OP.pop(); output=Reduce(s1,s2,op); S.push(output); } OP.push(str); } } else { cout<<"error"; return 0; } count++; } if(S.size()-OP.size()!=1) { cout<<"error"; return 0; } while(!OP.empty()) { string s1,s2,op,output; s1=S.top(); S.pop(); s2=S.top(); S.pop(); op=OP.top(); OP.pop(); output=Reduce(s1,s2,op); S.push(output); } cout<<S.top(); return 0; }
//遇到and出栈判断,其它情况入栈 public class MeiTuan { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String[] s = scanner.nextLine().split(" "); MeiTuan meiTuan = new MeiTuan(); meiTuan.boolString(s); } void boolString(String[] bool){ //新建栈用于存放运算符 Stack<String> stack = new Stack<>(); int length = bool.length; //and和or如果在首尾,出错! if (bool[0].equals("or")||bool[length-1].equals("or")||bool[0].equals("and")||bool[length-1].equals("and")){ System.out.println("error"); return; } for (int i=0;i<length;i++){ String curr=bool[i]; //如果当前为true或false if (curr.equals("true")||curr.equals("false")){ //如果栈为空,直接压入 if (stack.isEmpty()){ stack.push(curr); }else {//如果不为空,判断前一个是不是true或false。是,出错;不是的话,如果前一个为or,直接压入;如果为and,相与后再压入 String peek = stack.peek(); if (peek.equals("true")||peek.equals("false")){ System.out.println("error"); return; }else { if (peek.equals("or")){ stack.push(curr); }else { stack.pop();//取出and String pre= stack.pop();//取出and的前一个字符串 if (pre.equals("false")||curr.equals("false")){ stack.push("false"); }else { stack.push("true"); } } } } }else { //如果栈顶为or或and if(stack.isEmpty()){ System.out.println("error"); return; }else { String pre1 = stack.peek(); if (pre1.equals("or") || pre1.equals("and")) { System.out.println("error"); return; } else { stack.push(curr); } } } } //此时栈中都为true,false,or while (!stack.isEmpty()){ String end=stack.pop(); if (end.equals("true")){ System.out.println("true"); break; } if (stack.isEmpty()){ System.out.println("false"); } } } }
import java.util.Scanner; import java.util.Stack; public class buerbiaodashi { public static void Main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); String line = scanner.nextLine(); String[] splits = line.split(" "); if(splits[splits.length-1].equals("and")||splits[splits.length-1].equals("or")) { System.out.println("error"); return; } Stack<String> stack = new Stack<String>(); for(int i=0;i<splits.length;i++) { String temp = splits[i]; if(i%2==0&&(temp.equals("or")||temp.equals("and"))){ System.out.println("error"); return; }else if(i%2==1&&(temp.equals("true")||temp.equals("false"))) { System.out.println("error"); return; }else { if(temp.equals("and")) { temp = stack.pop(); temp = temp.equals("false")||splits[i+1].equals("false")?"false":"true"; stack.push(temp); i++; }else { stack.push(temp); } } } while(!stack.isEmpty()) { String istrue = stack.pop(); if(istrue.equals("true")) { System.out.println("true"); return; } } System.out.println("false"); return; } }
#include<iostream> (720)#include<cstdio> #include<stack> (850)#include<string> #include<queue> (789)#include<map> using namespace std; queue<int> q;//后缀队列 stack<int> st;//比较符号栈 map<string,int> mp;//优先级 void check(string s) { string t=""; for(int i=0;i<s.size()+1;i++) { if(i==s.size()||s[i]==' ') { if(t=="true") q.push(1); else if(t=="false") q.push(0); else { if(!st.empty()&&st.top()<mp[t]) { st.push(mp[t]); } else{ while(!st.empty()&&st.top()>=mp[t]) { q.push(st.top()); st.pop(); } st.push(mp[t]); } } t=""; } else{ t+=s[i]; } } while(!st.empty()) { q.push(st.top()); st.pop(); } } int cul() { stack<int> num; while(!q.empty()) { int n=q.front(); if(n==1||n==0) { num.push(n); } else{ if(num.empty()) return 2; int c2=num.top(); num.pop(); if(num.empty()) return 2; int c1=num.top(); num.pop(); if(n==3) { if(c1==1||c2==1) { num.push(1); } else { num.push(0); } } else { if(c1==1&&c2==1) { num.push(1); } else { num.push(0); } } } q.pop(); } if(num.size()>1||num.empty()) { return 2; } else{ return num.top(); } } int main() { mp["and"]=4; mp["or"]=3; string s; getline(cin,s); check(s); int n=cul(); if(n==1) cout<<"true"<<endl; else if(n==0) { cout<<"false"<<endl; } else { cout<<"error"<<endl; } }我的思路是本题与简单计算器中中缀表达式转后缀表达式类似,将true false and or 转换为后缀表达式,然后进行计算。
#include<iostream> #include<cstring> #include<stack> #include<unordered_map> using namespace std; stack<int> num; stack<char> op; int eval(){ int b,a; if(num.size()!=0) { b = num.top();num.pop();} else{ cout<<"error"; return 0; } if(num.size()!=0) { a = num.top();num.pop(); } else{ cout<<"error"; return 0; } auto c = op.top();op.pop(); int x ; if(c == '&') x = a&b; else x = a|b; num.push(x); return 1; } int main(){ string str; int cnt = 1; //定义优先级 unordered_map<char,int> pr{{'&',1},{'|',0}}; while(cin>>str){ if(cnt%2==1){ //是true false if(str!="true"&&str!="false"){ cout<<"error"; return 0; } if(str=="true") num.push(1); else num.push(0); }else{ //是and &nbs***bsp; if(str!="and"&&str!="or"){ cout<<"error"; return 0; } char op_pos; if(str == "and") op_pos = '&'; else op_pos = '|'; while(op.size()&&pr[op.top()]>=pr[op_pos]) if(!eval()) return 0; op.push(op_pos); } cnt++; } while(op.size()) if(!eval()) return 0; if(num.top()==1)cout<<"true"; else cout<<"false"; return 0; }
简简单单两小时,太菜了,害~ 使用一个栈,只存“true”、“false”、“or”。 如果第一个字符串是true或false,就入栈,这样后面就不用频繁判断栈空了;否则返回error 循环判断字符串数组 遇到“#” 跳过本次循环 遇到T F 如果栈顶是or,则入栈 否则返回error 遇到or 如果stack不为空 并且栈顶不为or 则入栈; 否则error 遇到and 如果stack为空或者i+1越界或者i+1不是T F,则返回error; 否则弹出一个元素,与下一个元素and运算,将下一个结果标记为“#”。将结果压入栈 到达字符串数组末尾,弹出所有元素并进行or运算,将结果返回
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); String[] s = sc.nextLine().split(" "); sc.close(); String str = helper(s); System.out.println(str); } public static String helper(String[] s){ Deque<String> stack = new LinkedList<>(); String tmp = ""; if (s[0].equals("true") || s[0].equals("false")) { stack.push(s[0]); }else { return "error"; } for (int i = 1; i < s.length; i++) { String s1 = s[i]; if(s1.equals("#")){ continue; } if (stack.peek().equals("true") || stack.peek().equals("false")) { if (s1.equals("or") && i + 1 < s.length) { stack.push(s1); }else if (s1.equals("and") && i + 1 < s.length) { tmp = stack.pop(); boolean t1 = Boolean.parseBoolean(tmp) && Boolean.parseBoolean(s[i+1]); stack.push(String.valueOf(t1)); s[i+1] = "#"; }else { return "error"; } }else { //栈顶是or if (s1.equals("true") || s1.equals("false")) { stack.push(s1); }else { return "error"; } } } if (!stack.isEmpty() || stack.peek().equals("true") || stack.peek().equals("false")){ tmp = stack.pop(); boolean res = Boolean.parseBoolean(tmp); while (!stack.isEmpty()){ tmp = stack.pop(); if (!tmp.equals("or")) { res |= Boolean.parseBoolean(tmp); } } return String.valueOf(res); }else { return "error"; } } }
#include <iostream> #include <string> #include <vector> using namespace std; enum class Token { True, False, And,&nbs***bsp; }; vector<Token> tokens; int idx; void handleError() { cout << "error" << endl; exit(0); } bool hasMore() { return idx < tokens.size(); } Token peek() { if (!hasMore()) handleError(); return tokens[idx]; } Token next() { if (!hasMore()) handleError(); return tokens[idx++]; } bool readBool(); bool calcExpr(); bool calcTerm(); bool calcExpr() { bool res = calcTerm(); while (hasMore()) { Token token = peek(); if (token != Token::Or) break; next(); res |= calcTerm(); } return res; } bool calcTerm() { bool res = readBool(); while (hasMore()) { Token token = peek(); if (token != Token::And) break; next(); res &= readBool(); } return res; } bool readBool() { Token token = next(); if (token != Token::True && token != Token::False) handleError(); return token == Token::True; } int main() { string s; while (cin >> s) { if (s == "true") { tokens.push_back(Token::True); } else if (s == "false") { tokens.push_back(Token::False); } else if (s == "and") { tokens.push_back(Token::And); } else if (s ==&nbs***bsp;{ tokens.push_back(Token::Or); } } bool res = calcExpr(); if (hasMore()) { handleError(); } if (res) { cout << "true" << endl; } else { cout << "false" << endl; } return 0; }
import java.util.Scanner; import java.util.Stack; public class Main { public static String judgeString(String a){ String result = new String(); if(a == null){ return "error"; } String[] s = a.split(" "); Stack<String> stack =new Stack<String>(); if(isLogical(s)) { if (s.length == 1) { result = s[0]; } else { for (int i = 0; i < s.length; i++) { if (!s[i].equals("and")) { stack.push(s[i]); } else { String temp1 = stack.pop(); //System.out.println(temp1 + "1"); String temp2 = s[i + 1]; //System.out.println(temp2 + "2"); if (temp2.equals("true") && temp1.equals("true")) { stack.push("true"); } else { stack.push("false"); } i = i + 1; } } String temp3 = new String(); String temp = stack.pop(); if (stack.size() == 1) { result = temp; } else{ for (int i = 0; i < stack.size(); i++) { //temp = stack.pop(); temp3 = stack.pop(); //System.out.println(temp3 + "3"); if (temp3.equals("or")) { String temp4 = stack.pop(); //System.out.println(temp4 + "4"); if (temp.equals("false") && temp4.equals("false")) { temp = "false"; } else { temp = "true"; } } } result = temp; } } } else{ result = "error"; } return result; } public static boolean isLogical(String[] s){ int a1 = 0; int a2 = 0; int a3 = 0; int a4 = 0; boolean b = true; if(s.length%2 == 0){ b = false; } for(int i = 0;i < s.length;i++){ if(s[i].equals("true")){ a1++; } if(s[i].equals("false")){ a2++; } if(s[i].equals("or")){ a3++; } if(s[i].equals("and")){ a4++; } } if(a1+a2+a3+a4!=s.length){ b = false; } for(int i = 0;i<s.length - 1;i++){ if(s[i].equals(s[i+1])){ b = false; break; } } if(s[s.length - 1].equals("or")||s[s.length - 1].equals("and")){ b = false; } if(s[0].equals("or")||s[0].equals("and")){ b = false; } return b; } public static void main(String args[]){ Scanner scanner = new Scanner(System.in); String a = scanner.nextLine(); String b = judgeString(a); System.out.println(b); } }
import java.util.*; public class Main{ public static void main(String[] strs){ String str = cal(); System.out.println(str); } public static String cal(){ Scanner sc = new Scanner(System.in); String str = sc.nextLine().trim(); // String str = "false&nbs***bsp;true and false"; String[] words = str.split(" "); // System.out.println(Arrays.toString(words)); Stack<Integer> stack = new Stack<>(); for(int i = 0; i < words.length; i++){ if(words[i].equals("true")){ stack.push(1); }else if(words[i].equals("false")){ stack.push(0); }else if(words[i].equals("and")){ if(!stack.isEmpty() && stack.peek() != 2 && i != words.length - 1 && (words[i + 1].equals("true") || words[i + 1].equals("false"))){ int val = words[i + 1].equals("true") ? 1 : 0; stack.push(stack.pop() & val); i++; }else return "error"; }else if(words[i].equals("or")){ stack.push(2); }else return "error"; } int last = -1; while (!stack.isEmpty()){ if(last == -1){ last = stack.pop(); if(last == 2) return "error"; }else{ int or = stack.pop(); if(or != 2) return "error"; int val = 0; if(!stack.isEmpty() && stack.peek() != 2) val = stack.pop(); else return "error"; last = last | val; } } return last == 1 ? "true" : "false"; } }
public static void main(String[] args) { Scanner scanner=new Scanner(System.in); String[] ss=scanner.nextLine().split(" "); Stack<String> stack=new Stack<>(); for(int i=0;i<ss.length;i++){ String curr=ss[i]; //当前值为true或false时 if(curr.equals("true")||curr.equals("false")){ if(stack.isEmpty()){ stack.push(curr); }else{ String top=stack.peek(); if(top.equals("true")||top.equals("false")){ System.out.println("error"); return; }else{ if(top.equals("or")) stack.push(curr); else{ stack.pop(); String pre=stack.pop(); if(curr.equals("false")||pre.equals("false")) stack.push("false"); else stack.push("true"); } } } } //当前值为and或or时 else{ if(stack.isEmpty()){ System.out.println("error"); return; }else{ String top=stack.peek(); if(top.equals("and")||top.equals("or")){ System.out.println("error"); return; } stack.push(curr); } } } if(!stack.isEmpty()&&(stack.peek().equals("or")||stack.peek().equals("and"))){ System.out.println("error"); return; } while(!stack.isEmpty()){ String curr=stack.pop(); if(curr.equals("true")){ System.out.println("true"); break; } if(stack.isEmpty()) System.out.println("false"); } }
#include <cstdio> #include <iostream> #include <sstream> #include <stack> #include <string> #include <vector> using namespace std; int main() { string s; vector<string>v; while (cin>>s) { // 注意 while 处理多个 case v.push_back(s); char c = getchar(); if(c=='\n'){ break; } // stringstream is(s); // string tmp; } //cout<<v.size()<<endl; stack<string>st_signal; stack<string>st_bool; //把所有string归类 bool ret = false; for (int i = 0; i < v.size(); i++) { if(i==v.size()-1){ if(v[i]=="and"||v[i]=="or"){ cout<<"error"<<endl; return 0; } } if (v[i] != "and" && v[i] !=&nbs***bsp;{ st_bool.push(v[i]); } else { if (v[i] == "and") { bool first, second; if (st_bool.empty()) { ret = false; break; } if (st_bool.top() == "false") { first = false; } else { first = true; } if (i + 1 >= v.size()) { ret = false; break; } else { if (v[i + 1] == "false") { second = false; } else { second = true; } i++; } st_bool.pop(); if (first && second == true) { st_bool.push("true"); } else { st_bool.push("false"); } } else { st_signal.push("or"); } } } if ((st_signal.size() == 0 && st_bool.size() > 1)||(st_signal.size()>st_bool.size())) { cout << "error" << endl; return 0; } while (!st_signal.empty()) { if (st_bool.size() <= 1) { ret = false; break; } else { bool first = st_bool.top() == "true" ? true : false; st_bool.pop(); bool second = st_bool.top() == "true" ? true : false; st_bool.pop(); if (first || second) { st_bool.push("true"); } else { st_bool.push("false"); } } } if (st_bool.size() == 1) { cout << st_bool.top() << endl; } else { cout << "error" << endl; } return 0; } // 64 位输出请用 printf("%lld"硬干就完事了
import java.io.*; import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); String str=sc.nextLine(); String[] splits=str.split(" "); int n=splits.length; LinkedList<String> stack=new LinkedList<>(); for(int i=0;i<n;i++){ if(splits[i].equals("and")){ if(stack.isEmpty()){ System.out.println("error"); return; } String last= stack.removeLast(); if(i+1==n||splits[i+1].equals("and")||splits[i+1].equals("or")){ System.out.println("error"); return; } stack.addLast(checkAnd(last,splits[++i])); }else{ stack.addLast(splits[i]); } } if(stack.size()==1){ // 要么只剩下一个,就是答案,要么至少三个 String last=stack.removeLast(); if(last.equals("and")||last.equals("or")){ System.out.println("error"); return; } System.out.println(last); return; } String s1=stack.removeFirst(),ans=""; // 全部剩下or while(!stack.isEmpty()){ // 至少有两个 if(stack.size()<2){ System.out.println("error"); return; } stack.removeFirst(); // 丢弃or符号 String s2=stack.removeFirst(); if(s2.equals("and")||s2.equals("or")){ System.out.println("error"); return; } s1=ans=checkOr(s1,s2); } System.out.println(ans); } static String checkAnd(String s1,String s2){ boolean b1=s1.equals("true")?true:false,b2=s2.equals("true")?true:false; return b1&&b2?"true":"false"; } static String checkOr(String s1,String s2){ boolean b1=s1.equals("true")?true:false,b2=s2.equals("true")?true:false; return b1||b2?"true":"false"; } }
该题采用语法分析解决, 文法规则如下
Or -> And or Or | And And -> T and And | T T -> true | false 文法开始符:Or 非终结符: Or And T 终结符 true false and or
写递归下降算法
// token enum Token { // 可以理解为 // private static final Token TRUE = new Token("key") TRUE("true"), FALSE("false"), END("end"), AND("and"), OR("or"); private final String key; private Token(String key) { this.key = key; } private String getKey() { return key; } public static Token findByKey(String key) { if(key == null) return null; for (Token token : Token.values()) { if(token.getKey().equals(key)) { return token; } } return null; } } public class Main { private static String[] strs=null; private static int index = -1; private static Token token = Token.END; private static boolean isError = false; public static void getToken() { ++index; if(index == strs.length) { token = Token.END; return; } token = Token.findByKey(strs[index]); } public static boolean&nbs***bsp;{ boolean output = And(); while (token == Token.OR) { getToken(); boolean tmp =&nbs***bsp; output = tmp || output; } return output; } public static boolean And() { boolean output; if(token == Token.TRUE) output = true; else if(token == Token.FALSE) output =false; // 出错, 因为And的First集合中并只包含true和false else { token = Token.FALSE; isError = true; return false; } getToken(); if (token == Token.AND) { getToken(); boolean tmp = And(); output = output && tmp; } return output; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String line = scanner.nextLine(); strs = line.split(" "); getToken(); boolean output = Main.Or(); // 若读完不是END, 则也算出错 if(token != Token.END || isError) { System.out.print("error"); } else{ System.out.print(output); } } }
public static void main(String[] args){ String input = "true&nbs***bsp;false and false and false and false"; System.out.println(check(input)); } public static String check(String input){ Stack<String> stringStack = new Stack<>(); String[] words = input.split(" "); for(int i=0;i< words.length;i++){ if(!"true".equals(words[i]) && !"false".equals(words[i]) && !"or".equals(words[i]) && !"and".equals(words[i])){ return "error"; } } for (int i = 0; i < words.length; i++) { // 如果遇到 and 则计算 if("and".equals(words[i])){ boolean front = Boolean.parseBoolean(words[i+1]); boolean behind = Boolean.parseBoolean(words[i-1]); Boolean res = front && behind; // 将栈顶元素修改为 res stringStack.pop(); stringStack.push(res.toString()); i = i + 1; continue; } // 将 words 压栈 stringStack.push(words[i]); } // stringStack.forEach(System.out::println); // 只剩下&nbs***bsp; AtomicReference<String> result = new AtomicReference<>("false"); stringStack.forEach(word -> { if ("true".equals(word)){ result.set("true"); } }); return result.get(); }
def isInvalid(flag, peek): # true或者false不能连续出现,and或者or不能连续出现 return ((flag == "true"&nbs***bsp;flag == "false") and (peek == "true"&nbs***bsp;peek == "false"))&nbs***bsp;\ ((flag == "and"&nbs***bsp;flag == "and") and (peek == "and"&nbs***bsp;peek == "and")) def doAnd(x, y): if x[0]=="t" and y[0]=="t": return "true" else: return "false" def doOr(x, y): if x[0]=="t"&nbs***bsp;y[0]=="t": return "true" else: return "false" def do(flags): # 不能以and和or结尾和开头 if flags[-1] == "and"&nbs***bsp;flags[-1] ==&nbs***bs***bsp;flags[0] == "and"&nbs***bsp;flags[0] ==&nbs***bsp; print("error") return stack = [] # 先处理所有and for flag in flags: # print(stack, "<-", flag, end=" = ") if len(stack)==0: stack.append(flag) elif isInvalid(flag, stack[-1]): print("error") return elif (flag == "true"&nbs***bsp;flag=="false") and stack[-1]=="and": pre1 = stack.pop() pre2 = stack.pop() stack.append(doAnd(flag, pre2)) else: stack.append(flag) # print(stack) # print("=========================") stack2 = [] # 再处理所有or for flag in stack: # print(stack2, "<-", flag, end=" = ") if len(stack2)==0: stack2.append(flag) elif isInvalid(flag, stack2[-1]): print("error") return elif (flag == "true"&nbs***bsp;flag=="false") and stack2[-1]=="or": pre1 = stack2.pop() pre2 = stack2.pop() stack2.append(doOr(flag, pre2)) else: stack2.append(flag) # print(stack2) print(stack2[0]) flags = input().split() do(flags)
#include <iostream> #include <string> #include <sstream> using namespace std; int judge(string str) { int flag, reslut, index = 0; string tmpstr, copystr = str; stringstream sstr(str); sstr >> tmpstr; if (tmpstr == "true") flag = 1; else if (tmpstr == "false") flag = 0; else return -1; index = tmpstr.size() + 1; //记录子串下标(包括空格) if (sstr >> tmpstr) { if (tmpstr == "and" || tmpstr ==&nbs***bsp;{ index += tmpstr.size() + 1; if (tmpstr == "and" && sstr >> tmpstr) { copystr = str.substr(index); reslut = judge(copystr); //copystr作为子串递归传参 if (reslut == -1) return -1; else flag = flag & reslut; } else if (tmpstr ==&nbs***bsp;&& sstr >> tmpstr) { copystr = str.substr(index); reslut = judge(copystr); if (reslut == -1) return -1; else flag = flag | reslut; } else return -1; } else return -1; } return flag; } int main() { string str; getline(cin, str); int flag = judge(str); switch (flag) { case -1: cout << "error" << endl; break; case 0: cout << "false" << endl; break; case 1: cout << "true" << endl; break; } return 0; }
""" S = expr&nbs***bsp;expr) expr = bool (and bool) """ class Expression: def __init__(self, op, left=None, right=None): self.op = op self.left = left self.right = right def execute(self): left = self.left.execute() if self.op ==&nbs***bsp;and left: return True if self.op == "and" and not left: return False right = self.right.execute() return right class Bool: def __init__(self, bool): self.bool = bool def execute(self): if self.bool == "true": return True return False class Interpreter: def tokenize(self, s): return s.split() def parse(self, tokens): self.index = 0 self.flag = False ast = self.parse_or_expression(tokens) if self.flag: return None return ast def parse_or_expression(self, tokens): left = self.parse_and_expression(tokens) if self.flag&nbs***bsp;self.index >= len(tokens): return left if tokens[self.index] ==&nbs***bsp; self.index += 1 right = self.parse_or_expression(tokens) return Expression("or", left, right) self.flag = True return left def parse_and_expression(self, tokens): left = self.parse_bool(tokens) if self.flag&nbs***bsp;self.index >= len(tokens): return left if tokens[self.index] ==&nbs***bsp; return left elif tokens[self.index] == 'and': self.index += 1 right = self.parse_and_expression(tokens) return Expression('and', left, right) self.flag = True return left def parse_bool(self, tokens): if self.index >= len(tokens): self.flag = True return None bool = tokens[self.index] if bool not in ('true', 'false'): self.flag = True self.index += 1 return Bool(bool) source = input() interpreter = Interpreter() tokens = interpreter.tokenize(source) expr = interpreter.parse(tokens) if expr: if expr.execute(): print("true") else: print("false") else: print("error")
import java.util.*; public class Main{ public static String calcSub(String n1, String n2, String ops){ if(ops.equals("and")){ if(n1.equals("true") && n2.equals("true")){ return "true"; }else{ return "false"; } }else{ if(n1.equals("false") && n2.equals("false")){ return "false"; }else{ return "true"; } } } public static void calc(Stack<String> op, Stack<String> num){ String n1 = num.pop(); String n2 = num.pop(); String ops = op.pop(); num.push(calcSub(n1, n2, ops)); } //表达式求值 public static String bds(String a){ Stack<String> num = new Stack<>(); Stack<String> op = new Stack<>(); String[] s = a.split(" "); int flag = 0; //数 for(int i=0;i<s.length;i++){ if(flag == 0) { if (!s[i].equals("true") && !s[i].equals("false")) { return "error"; }else{ num.push(s[i]); flag = 1; } }else{ if (!s[i].equals("and") && !s[i].equals("or")) { return "error"; }else{ //控制优先级 if(!op.empty() && "and".equals(op.peek())){ calc(op, num); } op.push(s[i]); flag = 0; } } } //这里为了解决 “true and” 最后是操作符的情况 if(flag == 0){ return "error"; } while(true){ if(op.empty()){ return num.pop(); } calc(op, num); } } public static void main(String[] args){ Scanner scanner=new Scanner(System.in); System.out.println(bds(scanner.nextLine())); } }