C++ 带替换的平衡表达式


括号的平衡表达式是指包含所有类型括号的配对,且顺序正确的表达式。这意味着每个左括号都有一个对应的右括号,并且括号的顺序正确,例如 { }。

让我们来看几个例子,以便更好地理解这个概念:

表达式 − {([][]{})({}[]{})}

输出 − 平衡

解释 − 我们可以看到,每个左括号都有一个对应的右括号。所有位于一对左括号和右括号之间的括号都是成对的。

输出 − 不平衡

解释 − 有一些括号的顺序不对,使得表达式不平衡。

在这个被称为“带替换的平衡表达式”的问题中,我们得到一个字符串,其中包含这些括号 ‘{’ , ‘}’ , ‘[’ , ‘]’ , ‘(’ , ‘)’ 。有些地方缺少括号,用“*”代替。我们必须检查是否可以通过用合适的括号替换所有星号符号,使给定的表达式成为有效的表达式。

示例

输入 − exp = “{[*(*)]}”

输出 − 表达式可以平衡

解释 − 有两个符号需要替换。替换后将变成 {[(())]}。

输入 − exp = “[(*){}{{}}]”

输出 − 表达式无法平衡

解释 − 有一个符号需要替换。用任何括号替换 * 后,表达式都无法平衡。

现在,既然我们对问题有了清晰的理解,我们可以为这个问题生成一个解决方案。为了检查给定的括号表达式是否平衡,我们将使用堆栈数据结构来执行我们的任务。

为了完成此任务而执行的操作是:

  • 遍历字符串表达式的每个元素并执行:

  • 当在表达式中遇到左括号,即 ‘{’ , ‘[’ , ‘(’ 时,将元素压入堆栈。

  • 当在表达式中遇到右括号,即 ‘}’ , ‘]’ , ‘)’ 时,弹出堆栈顶部的元素,并检查这是否是遇到的右括号对应的左括号。

    • 如果两个括号匹配,则移动到表达式的下一个元素(步骤 1)。

    • 如果两个括号不匹配,则表达式不平衡

  • 当在表达式中遇到 * 时,它可以是左括号也可以是右括号。然后:

    • 首先将其视为左括号并将其压入堆栈,并使用递归调用为下一个元素查找匹配的右括号。如果结果为假,则执行下一步

    • 将其视为右括号,它必须与堆栈顶部匹配,然后弹出堆栈顶部。

    • 如果 * 的右括号与左括号不匹配,则返回不平衡。

  • 根据结果打印语句。

示例

基于此解决方案,让我们创建一个程序

#include <bits/stdc++.h>
using namespace std;
int isMatching(char a, char b){
   if ((a == '{' &amp; b == '}') || (a == '[' &amp; b == ']') || (a == '(' &amp; b == ')') || a == '*')
      return 1;
   return 0;
}
int isBalancedexpression(string s, stack<char> ele, int ind){
   if (ind == s.length())
      return ele.empty();
   char topEle;
   int res;
   if (s[ind] == '{' || s[ind] == '(' || s[ind] == '[') {
      ele.push(s[ind]);
      return isBalancedexpression(s, ele, ind + 1);
   }
   else if (s[ind] == '}' || s[ind] == ')' || s[ind] == ']') {
      if (ele.empty())
         return 0;
      topEle = ele.top();
      ele.pop();
      if (!isMatching(topEle, s[ind]))
         return 0;
      return isBalancedexpression(s, ele, ind + 1);
   }
   else if (s[ind] == '*') {
      stack<char> tmp = ele;
      tmp.push(s[ind]);
      res = isBalancedexpression(s, tmp, ind + 1);
      if (res)
         return 1;
      if (ele.empty())
         return 0;
      ele.pop();
      return isBalancedexpression(s, ele, ind + 1);
   }
}
int main(){
   string s = "{[*(*)]}";
   stack ele;
   if (isBalancedexpression(s, ele, 0))
      cout << "Balanced";
   else
      cout << "Not Balanced";
   return 0;
}

输出

Balanced

更新于:2020年7月9日

318 次查看

开启你的职业生涯

完成课程获得认证

开始学习
广告