Cho biểu thức chứa dấu ngoặc. Kiểm tra các cặp ngoặc có cân bằng không. Các loại: (), {}, []. Ví dụ: "()[(){()}]" hợp lệ, "{[}]" không hợp lệ.
Thuật toán dùng Stack
- Duyệt biểu thức
- Nếu gặp ngoặc mở (, {, [ → push vào stack
- Nếu gặp ngoặc đóng ), }, ] → pop từ stack, kiểm tra có khớp không
- Sau khi duyệt xong: nếu stack còn phần tử → không cân bằng
Chương trình C++
#include <iostream>
#include <stack>
using namespace std;
bool isBalancedExp(string exp) {
stack<char> stk;
char x;
for (int i = 0; i < exp.length(); i++) {
if (exp[i] == '(' || exp[i] == '[' || exp[i] == '{') {
stk.push(exp[i]);
continue;
}
if (stk.empty()) return false;
switch (exp[i]) {
case ')':
x = stk.top(); stk.pop();
if (x == '{' || x == '[') return false;
break;
case '}':
x = stk.top(); stk.pop();
if (x == '(' || x == '[') return false;
break;
case ']':
x = stk.top(); stk.pop();
if (x == '(' || x == '{') return false;
break;
}
}
return stk.empty();
}
int main() {
string expresion = "()[(){()}]";
if (isBalancedExp(expresion))
cout << "This is Balanced Expression";
else
cout << "This is Not Balanced Expression";
}
Kết quả
This is Balanced Expression
Độ phức tạp
- Thời gian: O(n)
- Không gian: O(n) cho stack