文章目录
- 1. 题目
- 2. 解题
1. 题目
https://tianchi.aliyun.com/oj/245679029019779851/254275128279634588
给定一个字符串代表一个仅包含"true","false","or","and"
的布尔表达式。
你的任务是将这个表达式的值求出,返回"true"或"false"
。
如果该表达式是错误的,则返回"error"
。
数据保证表达式中只含有"true",“false”,“or”,"and"四种字符串。
表达式中的元素不会超过10000个。
示例
样例 1
输入:
"true and false"
输出:
"false"样例 2
输入:
"true or"
输出:
"error"
2. 解题
- 先检查是否是合法表达式,首尾只能是 bool,中间不能有连续的 操作符
- 在用栈记录 bool 值,遇到 and 时,当前 bool 与栈顶 bool 操作,再把结果入栈
- 遇到 or 直接把 bool 值入栈
- 最后栈内的 bool 全部做 or 运算
class Solution {
public:/*** @param expression: a string that representing an expression* @return: the result of the expression*/string evaluation(string &exp) {// write your code hereexp += ' ';string prev, cur;unordered_set<string> s1 = {"true", "false"},s2 = {"or", "and"};for(int i = 0; i < exp.size(); i++) {if(exp[i] != ' ')cur += exp[i];else{if((prev=="" || i==exp.size()-1) && (cur=="and" || cur=="or"))return "error";//首尾是操作符if((s1.count(prev)&&s1.count(cur))||(s2.count(prev)&&s2.count(cur)))return "error";//连续的操作数,或者连续的操作符prev = cur;cur = "";}}stack<bool> stk;prev = cur = "";for(int i = 0; i < exp.size(); i++) {if(exp[i] != ' ')cur += exp[i];else{if(prev=="" || prev=="or")stk.push(cur=="true" ? true : false);else if(prev == "and"){bool tp = stk.top();stk.pop();stk.push(tp&&(cur=="true" ? true : false));}prev = cur;cur = "";}}bool ans = stk.top();stk.pop();while(!stk.empty() && ans==false){ans = ans||stk.top();stk.pop();}return ans ? "true" : "false";}
};
50ms C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!