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 次檢視

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告