พิจารณาว่าเรามีนิพจน์ exp และเราต้องตรวจสอบว่า exp มีชุดวงเล็บที่ซ้ำกันล้อมรอบหรือไม่ นิพจน์จะมีวงเล็บที่ซ้ำกัน ถ้านิพจน์ย่อยหนึ่งรายการจะถูกล้อมรอบด้วยชุดวงเล็บมากกว่าหนึ่งชุด ตัวอย่างเช่น ถ้านิพจน์เป็นเหมือน −
(5+((7−3)))
ในที่นี้ นิพจน์ย่อย (7 – 3) ล้อมรอบด้วยวงเล็บสองคู่ ดังนั้นวงเล็บเหล่านี้จึงเป็นวงเล็บที่ซ้ำกัน
เพื่อแก้ปัญหานี้ เราจะใช้ stack เราจะวนซ้ำอักขระแต่ละตัวใน exp และถ้าตัวละครเปิดวงเล็บ '(' หรือโอเปอเรเตอร์หรือตัวถูกดำเนินการใดๆ ก็ตาม ให้ดันมันเข้าไปในสแต็ก เมื่อตัวละครปิดวงเล็บแล้ว ให้ป๊อปอักขระจากสแต็กซ้ำๆ จนกว่าจะพบวงเล็บเปิดที่ตรงกันและใช้ตัวนับซึ่งค่าจะเพิ่มขึ้นสำหรับอักขระทุกตัวที่พบระหว่างวงเล็บเปิดและวงเล็บปิดซึ่งเท่ากับค่าของตัวนับมีค่าน้อยกว่า 1 แล้ววงเล็บคู่ที่ซ้ำกัน ถูกพบ มิฉะนั้น ไม่พบ
ตัวอย่าง
#include<iostream>
#include<stack>
using namespace std;
bool hasDuplicateParentheses(string str) {
stack<char> stk;
for (int i = 0; i<str.length(); i++) {
char ch = str[i];
if (ch == ')') {
char top = stk.top();
stk.pop();
int count = 0;
while (top != '(') {
count++;
top = stk.top();
stk.pop();
}
if(count < 1) {
return true;
}
}
else
stk.push(ch);
}
return false;
}
int main() {
string str = "(5+((7-3)))";
if (hasDuplicateParentheses(str))
cout << "Duplicate parentheses has Found";
else
cout << "No Duplicates parentheses has Found ";
} ผลลัพธ์
Duplicate parentheses has Found