Stack_0_overview

  1. 20.有效的括号
  2. 1106.解析布尔表达式

20.有效的括号

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

示例 1:输入:s = “()” 输出:true

示例 2:输入:s = “()[]{}” 输出:true

示例 3:输入:s = “(]” 输出:false

分析:
1.总共有3种类型的括号, 发现合法的括号都是成对的出现的, 举几个合法的例子

(([[]]))
[()]
{}[[(())]]

2.再举几个不合法的例子

{[}]
)[{
{{(]]])

3.我们发现只要有一个右边的符号找不到和它马上匹配的左边的符号, 这个匹配都是失败的; 所以我们用栈记录最新的左边的符号, 不管是哪类左边符号都往里加入, 如果遇到了右边的符号, 马上找栈顶, 不匹配就是不合法的

class Solution {
 public:
  bool isValid(string s) {
    if (s == "") {
      return true;
    }
    stack<char> stk;
    for (auto& c : s) {
      if (c == '(' || c == '{' || c == '[') {
        stk.push(c);
      } else {
        if (stk.empty()) return false;
        char top = stk.top();
        stk.pop();
        if (c == ')' && top != '(') return false;
        if (c == '}' && top != '{') return false;
        if (c == ']' && top != '[') return false;
      }
    }
    return (stk.empty()) ? true : false;
  }
};

1106.解析布尔表达式

布尔表达式 是计算结果不是 true 就是 false 的表达式。有效的表达式需遵循以下约定:
‘t’,运算结果为 true
‘f’,运算结果为 false
‘!(subExpr)’,运算过程为对内部表达式 subExpr 进行 逻辑非(NOT)运算
‘&(subExpr1, subExpr2, …, subExprn)’,运算过程为对 2 个或以上内部表达式 subExpr1, subExpr2, …, subExprn 进行 逻辑与(AND)运算
‘|(subExpr1, subExpr2, …, subExprn)’,运算过程为对 2 个或以上内部表达式 subExpr1, subExpr2, …, subExprn 进行 逻辑或(OR)运算
给你一个以字符串形式表述的 布尔表达式 expression,返回该式的运算结果。
题目测试用例所给出的表达式均为有效的布尔表达式,遵循上述约定。

示例 1:输入:expression = “&(|(f))” 输出:false
解释:
首先,计算 |(f) —> f ,表达式变为 “&(f)” 。
接着,计算 &(f) —> f ,表达式变为 “f” 。
最后,返回 false 。
示例 2:输入:expression = “|(f,f,f,t)” 输出:true
解释:计算 (false OR false OR false OR true) ,结果为 true 。
示例 3:输入:expression = “!(&(f,t))” 输出:true
解释:
首先,计算 &(f,t) —> (false AND true) —> false —> f ,表达式变为 “!(f)” 。
接着,计算 !(f) —> NOT false —> true ,返回 true 。

分析:
1.遇到括号直接用栈处理
2.逐个扫描字符串, 如果遇到t,f,!,&,|, 左括号,直接入栈, 遇到”,” 直接忽略, 遇到右括号那么要处理一下里面的逻辑表达式, 想办法弄出来里面逻辑表达式的结果, 然后入栈, 依次出栈, 然后直到遇到左括号
3.每次处理里面的表达式的时候, 通过统计t和f的个数, 这个t和f的个数能判断出来里面的结果, 如此做法就可以处理当前内层的逻辑结果

class Solution {
 public:
  bool parseBoolExpr(string expression) {
    int len = expression.size();
    stack<char> stk;
    for (auto& c : expression) {
      if (c == '&' || c == '!' || c == 't' || c == 'f' || c == '|' || c == '(') {
        stk.push(c);
      } else if (c == ')') {
        int trueCnt = 0;
        int falseCnt = 0;
        while (stk.top() != '(') {
          char val = stk.top();
          stk.pop();
          if (val == 't') {
            ++trueCnt;
          } else if (val == 'f') {
            ++falseCnt;
          }
        }
        stk.pop();
        char op = stk.top();
        stk.pop();
        if (op == '!') {
          stk.push(falseCnt == 1 ? 't' : 'f');
        } else if (op == '&') {
          stk.push(falseCnt == 0 ? 't' : 'f');
        } else if (op == '|') {
          stk.push(trueCnt > 0 ? 't' : 'f');
        }
      }
    }
    return stk.top() == 't';
  }
};

转载请注明来源 goldandrabbit.github.io