前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >天池 在线编程 布尔表达式求值(栈)

天池 在线编程 布尔表达式求值(栈)

作者头像
Michael阿明
发布2021-02-19 14:34:02
4050
发布2021-02-19 14:34:02
举报
文章被收录于专栏:Michael阿明学习之路

1. 题目

给定一个字符串代表一个仅包含"true","false","or","and"的布尔表达式。 你的任务是将这个表达式的值求出,返回"true"或"false"。 如果该表达式是错误的,则返回"error"

数据保证表达式中只含有"true",“false”,“or”,"and"四种字符串。 表达式中的元素不会超过10000个。

代码语言:javascript
复制
示例
样例 1 
输入:
"true and false"
输出:
"false"

样例 2
输入:
"true or"
输出:
"error"

2. 解题

  • 先检查是否是合法表达式,首尾只能是 bool,中间不能有连续的 操作符
  • 在用栈记录 bool 值,遇到 and 时,当前 bool 与栈顶 bool 操作,再把结果入栈
  • 遇到 or 直接把 bool 值入栈
  • 最后栈内的 bool 全部做 or 运算
代码语言:javascript
复制
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/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档