C++ 带替换的平衡表达式
括号的平衡表达式是指包含所有类型括号的配对,且顺序正确的表达式。这意味着每个左括号都有一个对应的右括号,并且括号的顺序正确,例如 { }。
让我们来看几个例子,以便更好地理解这个概念:
表达式 − {([][]{})({}[]{})}
输出 − 平衡
解释 − 我们可以看到,每个左括号都有一个对应的右括号。所有位于一对左括号和右括号之间的括号都是成对的。
输出 − 不平衡
解释 − 有一些括号的顺序不对,使得表达式不平衡。
在这个被称为“带替换的平衡表达式”的问题中,我们得到一个字符串,其中包含这些括号 ‘{’ , ‘}’ , ‘[’ , ‘]’ , ‘(’ , ‘)’ 。有些地方缺少括号,用“*”代替。我们必须检查是否可以通过用合适的括号替换所有星号符号,使给定的表达式成为有效的表达式。
示例
输入 − exp = “{[*(*)]}”
输出 − 表达式可以平衡
解释 − 有两个符号需要替换。替换后将变成 {[(())]}。
输入 − exp = “[(*){}{{}}]”
输出 − 表达式无法平衡
解释 − 有一个符号需要替换。用任何括号替换 * 后,表达式都无法平衡。
现在,既然我们对问题有了清晰的理解,我们可以为这个问题生成一个解决方案。为了检查给定的括号表达式是否平衡,我们将使用堆栈数据结构来执行我们的任务。
为了完成此任务而执行的操作是:
遍历字符串表达式的每个元素并执行:
当在表达式中遇到左括号,即 ‘{’ , ‘[’ , ‘(’ 时,将元素压入堆栈。
当在表达式中遇到右括号,即 ‘}’ , ‘]’ , ‘)’ 时,弹出堆栈顶部的元素,并检查这是否是遇到的右括号对应的左括号。
如果两个括号匹配,则移动到表达式的下一个元素(步骤 1)。
如果两个括号不匹配,则表达式不平衡。
当在表达式中遇到 * 时,它可以是左括号也可以是右括号。然后:
首先将其视为左括号并将其压入堆栈,并使用递归调用为下一个元素查找匹配的右括号。如果结果为假,则执行下一步
将其视为右括号,它必须与堆栈顶部匹配,然后弹出堆栈顶部。
如果 * 的右括号与左括号不匹配,则返回不平衡。
根据结果打印语句。
示例
基于此解决方案,让我们创建一个程序
#include <bits/stdc++.h> using namespace std; int isMatching(char a, char b){ if ((a == '{' & b == '}') || (a == '[' & b == ']') || (a == '(' & 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