โจทย์
ให้นิพจน์ที่มีวงเล็บ ต้องการพิมพ์หมายเลขลำดับของวงเล็บ ตัวอย่าง: ((()())()) → 1 2 3 3 4 4 2 5 5 1
วิธีแก้ปัญหา (Stack)
- ตัวนับ leftBracket เริ่มที่ 1
- Stack เก็บหมายเลขวงเล็บซ้าย
- เจอ '(' → พิมพ์ leftBracket, push เข้า stack, leftBracket++
- เจอ ')' → พิมพ์ top ของ stack, pop
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
void bracketCount(string expression, int n) {
int leftBracket = 1;
stack<int> rightBracket;
for (int i = 0; i < n; i++) {
if (expression[i] == '(') {
cout << leftBracket << " ";
rightBracket.push(leftBracket);
leftBracket++;
} else if (expression[i] == ')') {
cout << rightBracket.top() << " ";
rightBracket.pop();
}
}
}
int main() {
string expression = "()((())()())";
int n = expression.size();
bracketCount(expression, n);
return 0;
}
ผลลัพธ์
1 1 2 3 4 4 3 5 5 6 6 2