Bài 1. INNGUOC - In ngược dãy số
INNGUOC.*Nhập vào một số N và một dãy gồm N số nguyên. Hãy in ra dãy đó theo thứ tự ngược lại.
Input
7 1 3 5 4 6 10 3
Output
3 10 6 4 5 3 1
Bài giảng được soạn lại theo dạng trang web học tập: dễ đọc, có mục lục liên kết, lý thuyết, code mẫu, bảng hàm và bài tập ứng dụng.
Stack là cấu trúc dữ liệu hoạt động theo nguyên tắc LIFO: Last In, First Out, nghĩa là phần tử được đưa vào sau cùng sẽ được lấy ra trước tiên.
Phần tử ở trên cùng của stack gọi là đỉnh stack, truy cập bằng hàm top().
Hãy tưởng tượng một chồng sách đặt trên bàn. Cuốn sách đặt sau cùng nằm trên cùng, nên khi lấy sách ta sẽ lấy cuốn đó trước. Đây chính là nguyên tắc vào sau ra trước.
Khai báo stack số nguyên:
#include <bits/stdc++.h> using namespace std; stack<int> st;
| Hàm | Ý nghĩa | Độ phức tạp | Ví dụ |
|---|---|---|---|
| size() | Trả về số phần tử hiện có trong stack. | O(1) | st.size() |
| empty() | Kiểm tra stack có rỗng hay không. Rỗng trả về true, ngược lại false. | O(1) | st.empty() |
| push(x) | Đưa phần tử x vào đỉnh stack. | O(1) | st.push(5) |
| pop() | Xóa phần tử ở đỉnh stack. Hàm này không trả về giá trị. | O(1) | st.pop() |
| top() | Truy cập phần tử ở đỉnh stack. | O(1) | st.top() |
| swap() | Hoán đổi nội dung của hai stack cùng kiểu dữ liệu. | Thường O(1) | st.swap(st2) |
#include <bits/stdc++.h>
using namespace std;
int main() {
stack<int> st;
st.push(1);
st.push(2);
st.push(3);
cout << st.top() << '\n'; // 3
st.pop();
cout << st.top() << '\n'; // 2
return 0;
}#include <bits/stdc++.h>
using namespace std;
int main() {
stack<int> st, st2;
for (int i = 1; i <= 4; i++)
st.push(i); // st = {1,2,3,4}
cout << st.empty() << '\n'; // 0
st.pop(); // st = {1,2,3}
cout << st.empty() << '\n'; // 0
st2.swap(st); // st2 nhận các phần tử của st, st rỗng
cout << st.empty() << '\n'; // 1
return 0;
}Stack không cho truy cập bằng chỉ số như mảng. Muốn in các phần tử, ta thường lấy lần lượt từ đỉnh bằng top() rồi pop().
while (!st.empty()) {
cout << st.top() << ' ';
st.pop();
}Đưa lần lượt phần tử vào stack, sau đó lấy ra sẽ thu được thứ tự ngược lại.
Gặp dấu mở thì push, gặp dấu đóng thì kiểm tra và pop. Nếu cuối cùng stack rỗng thì hợp lệ.
Stack giúp xử lý các biểu thức có ngoặc, ví dụ tính khối lượng hóa chất dạng nén.
Dùng để giải bài toán nhìn thấy nhau, phần tử gần hơn/lớn hơn, hoặc tối ưu trên dãy.
Các thao tác vừa thực hiện được lưu ở đỉnh stack để có thể hoàn tác ngược lại.
Stack có thể thay thế lời gọi đệ quy trong duyệt đồ thị hoặc cây.
| Bài | Tên bài | Kỹ năng chính | Mức độ |
|---|---|---|---|
| 1 | INNGUOC - In ngược dãy số | Đảo thứ tự bằng stack | Dễ |
| 2 | ROBOT - Ngôn ngữ robot | Đảo chuỗi, bỏ dấu cách | Dễ |
| 3 | DAUNGOAC - Kiểm tra ngoặc | Stack kiểm tra hợp lệ | Trung bình |
| 4 | HOACHAT - Khối lượng hóa chất | Stack và biểu thức ngoặc | Khá |
| 5 | XEPHANG - Xếp hàng | Stack đơn điệu | Khá |
Nhập vào một số N và một dãy gồm N số nguyên. Hãy in ra dãy đó theo thứ tự ngược lại.
7 1 3 5 4 6 10 3
3 10 6 4 5 3 1
Robot nói ngược lại câu của con người và tự động bỏ các dấu cách. Hãy chuyển câu nói sang ngôn ngữ robot.
I am human
namuhmaI
Cho một dãy gồm các dấu ngoặc tròn ( và ). Hãy kiểm tra dãy ngoặc có hợp lệ hay không.
4 (())
YES
6 ()(()(
NO
Một công thức hóa chất chỉ gồm các nguyên tố C, H, O, dấu ngoặc và chữ số từ 2 đến 9. Biết khối lượng C = 12, H = 1, O = 16. Hãy tính khối lượng của công thức.
COOH CH(CO2H)3
45 148
Có N người đứng xếp hàng, mỗi người có một chiều cao. Hai người nhìn thấy nhau nếu đứng cạnh nhau hoặc giữa họ không có ai cao hơn hẳn một trong hai người. Hãy đếm số cặp có thể nhìn thấy nhau.
7 2 4 1 2 2 5 1
10