นิพจน์ที่สมดุลของวงเล็บคือนิพจน์ที่มีคู่ของวงเล็บทั้งหมดเข้าด้วยกันในลำดับที่ถูกต้อง ซึ่งหมายความว่าสำหรับวงเล็บเปิดทุกอัน จะมีวงเล็บปิดในลำดับที่เหมาะสมของวงเล็บ เช่น { }.
มาดูตัวอย่างเพื่อทำความเข้าใจแนวคิดกันดีกว่า -
นิพจน์ − {([][]{})({}[]{})}
ผลผลิต − สมดุล
คำอธิบาย − เราจะเห็นได้ว่าวงเล็บเปิดทุกอันจะมีวงเล็บปิด วงเล็บทั้งหมดอยู่ระหว่างวงเล็บเปิดและวงเล็บปิดเป็นคู่
ผลผลิต - ไม่สมดุล
คำอธิบาย − มีวงเล็บคู่ที่ไม่เรียงลำดับซึ่งทำให้นิพจน์ไม่สมดุล
ในปัญหานี้เรียกว่า แสดงความสมดุลด้วยการแทนที่ เราได้รับสตริงที่มีนิพจน์ของวงเล็บเหล่านี้ '{' , '}' , '[' , ']' , '(' , ')' มีบางตำแหน่งที่วงเล็บหายไปและใส่ "*" แทนวงเล็บ และเราต้องตรวจสอบสภาพอากาศในการแทนที่สัญลักษณ์ดอกจันทั้งหมดด้วยวงเล็บที่เหมาะสม นิพจน์ที่กำหนดสามารถกลายเป็นนิพจน์ที่ถูกต้องได้
ตัวอย่าง
ป้อนข้อมูล − exp =“{[*(*)]}”
ผลผลิต − การแสดงออกสามารถสมดุลได้
คำอธิบาย − มีสองสัญลักษณ์ที่ต้องเปลี่ยน และการแทนที่จะกลายเป็น {[(())]}
ป้อนข้อมูล − exp =“[(*){}{{}}]”
ผลผลิต − นิพจน์ไม่สามารถสมดุลได้
คำอธิบาย − มีหนึ่งสัญลักษณ์ที่ต้องเปลี่ยน และเมื่อแทนที่ * ด้วยวงเล็บปีกกาใดๆ นิพจน์จะไม่สามารถปรับสมดุลได้
เนื่องจากเราเข้าใจปัญหาอย่างชัดเจนแล้ว เราจึงสามารถสร้างวิธีแก้ปัญหาสำหรับปัญหานี้ได้ ในการตรวจสอบว่านิพจน์วงเล็บที่กำหนดจะสมดุลหรือไม่ เราจะใช้โครงสร้างข้อมูลสแต็กเพื่อทำงานของเรา
การดำเนินการที่ดำเนินการเพื่อให้บรรลุภารกิจนี้คือ −
-
สำรวจทุกองค์ประกอบของนิพจน์สตริงและทำ -
-
เมื่อพบวงเล็บเปิดในนิพจน์เช่น '{' , '[' , '(' ให้ดันองค์ประกอบในสแต็ก
-
เมื่อพบวงเล็บปิดในนิพจน์เช่น '}' , ']' , ')' เปิดองค์ประกอบที่ด้านบนของสแต็กและตรวจสอบว่านี่เป็นช่องเปิดที่ตรงกันสำหรับวงเล็บปิดที่พบหรือไม่
-
หากวงเล็บทั้งสองตรงกัน ให้ย้ายไปยังองค์ประกอบถัดไปของนิพจน์ (ขั้นตอนที่ 1)
-
หากวงเล็บทั้งสองไม่ตรงกัน แสดงว่านิพจน์ ไม่สมดุล
-
-
เมื่อพบ * ในนิพจน์ซึ่งสามารถเป็นวงเล็บเปิดและปิดได้ จากนั้น
-
ขั้นแรกให้ถือว่าเป็นวงเล็บเปิดและดันเข้าไปในสแต็กและค้นหาวงเล็บปิดที่ตรงกันโดยใช้การเรียกซ้ำสำหรับองค์ประกอบถัดไป หากผลลัพธ์เป็น fasle ให้ทำตามขั้นตอนต่อไป
-
ถือว่าเป็นวงเล็บปิด โดยจะต้องตรงกับส่วนบนของสแต็ก จากนั้นจึงเปิดส่วนบนของสแต็ก
-
เป็นค่าปิดของ * ไม่ตรงกับการเปิดผลตอบแทนไม่สมดุล
-
-
พิมพ์ข้อความตามผลลัพธ์
ตัวอย่าง
จากโซลูชันนี้ มาสร้างโปรแกรมกันเถอะ
#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