给定一个字符串代表一个仅包含"true","false","or","and"
的布尔表达式。
你的任务是将这个表达式的值求出,返回"true"或"false"
。
如果该表达式是错误的,则返回"error"
。
数据保证表达式中只含有"true",“false”,“or”,"and"四种字符串。 表达式中的元素不会超过10000个。
示例
样例 1
输入:
"true and false"
输出:
"false"
样例 2
输入:
"true or"
输出:
"error"
class Solution {
public:
/**
* @param expression: a string that representing an expression
* @return: the result of the expression
*/
string evaluation(string &exp) {
// write your code here
exp += ' ';
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++