1. 程式人生 > 其它 >天池 線上程式設計 布林表示式求值(棧)

天池 線上程式設計 布林表示式求值(棧)

技術標籤:LintCode及其他OJ

文章目錄

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 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阿明),一起加油、一起學習進步!
Michael阿明