天池 線上程式設計 布林表示式求值(棧)
阿新 • • 發佈:2021-01-02
技術標籤:LintCode及其他OJ
文章目錄
1. 題目
https://tianchi.aliyun.com/oj/245679029019779851/254275128279634588
給定一個字串代表一個僅包含"true","false","or","and"
的布林表示式。
你的任務是將這個表示式的值求出,返回"true"或"false"
。
如果該表示式是錯誤的,則返回"error"
。
資料保證表示式中只含有"true",“false”,“or”,"and"四種字串。
示例
樣例 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 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++
我的CSDN部落格地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!