Cho biểu thức chỉ chứa dấu ngoặc. In số thứ tự của từng cặp ngoặc. Ví dụ: "((()())())" → 1 2 3 3 4 4 2 5 5 1. Mở ngoặc: in số thứ tự tăng. Đóng ngoặc: in số của ngoặc mở tương ứng (lấy từ stack).
Stack theo dõi cặp ngoặc
Biến left=1 đếm ngoặc mở. Stack lưu số thứ tự. Gặp '(' → in left, push left, left++. Gặp ')' → in stack.top(), pop.
Ví dụ minh họa
#include <bits/stdc++.h>
using namespace std;
void printBracketNumbers(string expr) {
int left = 1;
stack st;
for (char c : expr) {
if (c == '(') {
cout << left << ' ';
st.push(left);
left++;
} else if (c == ')') {
cout << st.top() << ' ';
st.pop();
}
}
}
int main() {
string expr = "()((())()())";
printBracketNumbers(expr);
return 0;
}
Kết quả
1 1 2 3 4 4 3 5 5 6 6 2