Tải bản đầy đủ (.doc) (21 trang)

Đáp án lý thuyết kỹ thuật lập trình

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (263.15 KB, 21 trang )

ĐÁP ÁN LÝ THUYẾT KTLT
Câu 1: Nêu khái niệm và vai trị của sắp xếp. Cho ví dụ minh họa về vai trị của sắp xếp.
Trả lời:
• Khái niệm: Sắp xếp là q trình bố trí các phần tử trong một tập hợp theo một trình tự
nào đó. Trong khoa học máy tính và trong tốn học, thuật tốn sắp xếp là một thuật toán sắp
xếp các phần tử của một danh sách (hoặc một mảng) theo thứ tự (tăng hoặc giảm).
• Vai trị: Sắp xếp nhằm mục đích giúp quản lý và tìm kiếm các phần tử dễ dàng và nhanh
chóng hơn.
• Ví dụ: Các ứng dụng quản ký danh bạ điện thoại thì có sắp xếp theo số, theo tên. Quản lý
học sinh thì có sắp xếp theo điểm, theo lớp, theo trường . . .
Câu 2: Nêu ý tưởng giải thuật sắp xếp chèn. Cho ví dụ và thực hiện từng bước của giải thuật
sắp xếp chèn.
Trả lời:
• Ý tưởng sắp xếp chèn:
Thuật tốn sắp xếp chèn thực hiện sắp xếp dãy số theo cách duyệt từng phần tử và chèn
từng phần tử đó vào đúng vị trí trong mảng con (dãy số từ đầu đến phần tử phía trước nó) đã
sắp xếp sao cho dãy số trong mảng đã sắp xếp đó vẫn đảm bảo tính chất của một dãy số tăng
dần.
B1: Khởi tạo mảng với dãy con đã sắp xếp có k = 1 phần tử (phần tử đầu tiên – phần tử
có chỉ số 0).
B2: Duyệt từng phần tử từ phần tử thứ 2, tại mỗi lần duyệt phần tử ở chỉ số i thì đặt
phần tử đó vào vị trí nào đó trong đoạn từ [0 … i] sao cho dãy số từ [0…i] vẫn đảm bảo tính
chất dãy số tăng dần. Sau mỗi lần duyệt, số phần tử đã được sắp xếp trong mảng tăng thêm 1
phần tử.
B3: lặp cho tới khi duyệt hết tất cả các phần tử của mảng.
• Ví dụ:
Sắp xếp dãy X ={ 1 7
3
8
2
6


4} thành dãy không giảm.
i
i=1
i=2
i=3
i=4
i=5
i=6

0
1
1
1
1
1
1
1

1
7
7
3
3
2
2
2

2
3
3

7
7
3
3
3

3
8
8
8
8
7
6
4

4
2
2
2
2
8
7
6

5
6
6
6
6
6

8
7

6
4
4
4
4
4
4
8


Câu 3: Nêu ý tưởng giải thuật sắp xếp chọn. Cho ví dụ và thực hiện từng bước của giải thuật
sắp xếp chọn.
Trả lời:
• Ý tưởng:
- Tìm phần tử nhỏ nhất trong mảng đưa lên vị trí đầu tiên.
- Giả sử có k phần tử ở đầu đã được sắp xếp
- Tìm phần tử bé nhất từ k+1 đến n, đổi chổ cho phần tử tại k+1.
- Lặp tương tự cho đến phần tử N-1.
• Ví dụ:
i
0
1
2
3
4
5


vtmin
0
4
2
6
5
5

0
1
1
1
1
1
1

1
7
7
2
2
2
2

2
3
3
3
3
3

3

3
8
8
8
8
4
4

4
2
2
7
7
7
6

5
6
6
6
6
6
7

6
4
4
4

4
8
8

Câu 4: Nêu ý tưởng giải thuật sắp xếp nổi bọt. Cho ví dụ và thực hiện từng bước của giải thuật
sắp xếp nổi bọt
Trả lời:
• Ý tưởng:
− Xét 2 phần tử đầu tiên của dãy, nếu khơng đúng thứ tự thì đổi chỗ cho nhau.
− Tiếp tục xét các cặp đến cuối dãy
− Lặp lại quá trình với cặp đầu dãy đến khi khơng có cặp nào sai thứ tự.
• Sắp xếp dãy: X ={ 14
33
27
35
10} thành dãy không giảm
i=0
14
14
14
14
14
14
14
10

1
33
33
27

27
27
27
10
14

2
27
27
33
33
33
10
27
27

3
35
35
35
35
10
33
33
33

4
10
10
10

10
35
35
35
35


Câu 5: Trình bày phương pháp tìm kiếm tuần tự cho danh sách đã sắp xếp và danh sách chưa
sắp xếp. Nhập một dãy số nguyên đã sắp xếp, sử dụng phương pháp tìm kiếm tuần tự để tìm
tất cả các phần tử có giá trị bằng x được nhập.
Trả lời:
Thuật tốn tìm kiếm tuyến tính (linear search) hay cịn gọi là thuật tốn tìm kiếm tuần
tự (Sequential search) là một phương pháp tìm kiếm một phần tử cho trước trong một danh
sách bằng cách duyệt lần lượt từng phần tử của danh sách đó cho đến lúc tìm thấy giá trị
mong muốn hay đã duyệt qua toàn bộ danh sách.
Ý tưởng thuật tốn: xét dãy số cần tìm có n phần tử: a[0], a[1], a[2], ... , a[n-1].Giá trị
cần tìm là x.
- Bắt đầu từ khố đầu tiên, lần lượt so sánh khoá x với khoá tương ứng trong dãy.
- Quá trình tìm kiếm kết thúc khi tìm được khoá thoả mãn hoặc đi đến hết dãy hoặc gặp
điều kiện dừng vòng lặp.
Với danh sách chưa sắp xếp, ta tìm kiếm đến khi tìm thấy phần tử có giá trị bằng giá trị
cần tìm, nếu phần tử cuối cùng của danh sách khơng bằng thì kết luận khơng tìm thấy. Với
danh sách đã sắp xếp, ta phải duyệt danh sách để tìm kiếm, nếu giá trị của phần tử lớn hơn giá
trị cần tìm thì dừng lại và khơng kết luận tìm thấy.
 Trên danh sách đã được sắp xếp
int SequentialSearch (int x, int a[], int n){
int i=0;
while (i i = i+1;
if (a[i]==x) return (i);

else return 0; // giá trị trả về là i (tìm thấy), 0 (khơng tìm thấy)
}


Trên danh sách chưa sắp xếp
int SequentialSearch(int x, int a[],int n){
int i =0;
while (i i = i+1;
return (i); //giá trị trả về là i<=n-1 (tìm thấy), i=n (khơng tìm thấy)
}

Câu 6: Trình bày phương pháp tìm kiếm nhị phân. Cho ví dụ minh họa.


Trả lời:
Phép tìm kiếm nhị phân được thực hiện trên dãy khố có thứ tự (xét dãy tăng dần):
a[0] <= a[1] <= a[2] <=...<= a[n-1]. Giá trị cần tìm x.
Chia đơi dãy khố cần tìm kiếm. So sánh khố giữa dãy với x, có 3 trường hợp xảy ra:
- Giá trị khố này bằng x, tìm kiếm thành cơng
- Giá trị khố này lớn hơn x, thì ta tiến hành tìm x với nữa bên trái của khố này
- Giá trị khố này nhỏ hơn x, thì ta tiến hành tìm x với nữa bên phải của khố này
Trường hợp tìm kiếm thất bại khi dãy khố cần tìm khơng có phần tử nào.
• Ví dụ:
Giả sử chúng ta cần tìm vị trí của giá trị 31 trong một mảng bao gồm các giá trị như hình
dưới đây bởi sử dụng Binary Search:

Đầu tiên, chúng ta chia mảng thành hai nửa theo phép toán sau:
mid = left + (right + left)/ 2


Với ví dụ trên là 0 + (9 – 0)/ 2 = 4 (giá trị là 4.5). Do đó 4 là chỉ mục giữa của mảng.
Bây giờ chúng ta so sánh giá trị phần tử giữa với phần tử cần tìm. Giá trị phần tử giữa là
27 và phần tử cần tìm là 31, khơng bằng nhau. Bởi vì giá trị cần tìm là lớn hơn nên phần tử
cần tìm sẽ nằm ở mảng con bên phải phần tử giữa.
Chúng ta thay đổi giá trị left thành (mid + 1) và lại tiếp tục tìm kiếm giá trị mid.
left = mid + 1

mid = left + (right + left)/ 2
Bây giờ mid của chúng ta là 7. Chúng ta so sánh giá trị tại chỉ mục này với giá trị cần tìm.

Giá trị tại chỉ mục 7 là khơng kết nối, và ngồi ra giá trị cần tìm là nhỏ hơn giá trị tại chỉ
mục 7 do đó chúng ta cần tìm trong mảng con bên trái của chỉ mục giữa này.


Tiếp tục tìm mid lần nữa. Lần này nó có giá trị là 5.

So sánh giá trị tại chỉ mục 5 với giá trị cần tìm và thấy rằng nó bằng nhau.

Do đó chúng ta kết luận rằng giá trị cần tìm 31 được lưu giữ tại vị trí chỉ mục 5.
Câu 7: Trình bày cấu trúc dữ liệu danh sách liên kết đơn. Cài đặt thao tác thêm một phần tử
vào đầu danh sách.
Trả lời:
Danh sách liên kết đơn là một cấu trúc dữ liệu bao gồm một tập các nút, mà mỗi nút bao
gồm:
- Dữ liệu cần lưu trữ.
- Liên kết đến nút tiếp theo.

void themDau(int x)
{
Node*temp =new Node; //câp vùng nhớ cho temp

temp->value =x; //gán giá trị x cho node temp
temp->next = NULL; //cho con trỏ next của node temp trỏ tới null
if (list == NULL) //nếu phần tử đầu tiên là rỗng thì gán phần tử
bằng temp
list = temp;
else
// ngược lại nếu phần tử đầu tiên không rỗng
{
temp->next = list; // cho con trỏ của node cần thêm liên kết
với node đầu là list
list = temp; // cập nhập lại: phần tử đầu (node đầu) list bây
giờ là node cần thêm
}
}

Câu 8: Trình bày cấu trúc dữ liệu danh sách liên kết đơn. Cài đặt thao tác thêm một phần tử
vào cuối danh sách.
Trả lời:


Danh sách liên kết đơn là một cấu trúc dữ liệu bao gồm một tập các nút, mà mỗi nút bao
gồm:
- Dữ liệu cần lưu trữ.
- Liên kết đến nút tiếp theo.

Void themCuoi(int x)
{
Node*temp = new Node;
temp->value = x;
temp ->next = NULL;

if (list == NULL) //nếu phần tử đầu tiên là rỗng thì gán phần tử đó
bằng temp
list = temp;
else
// ngược lại nếu phần tử đầu tiên không rỗng
{
Node*p = list;
while (p->next!=NULL)
{
p = p->next; //Duyệt danh sách đến cuối. node cuối là node
có next =NULL
}
p->next = temp; // Gán next của node cuối bằng temp, khi đó
temp là node cuối.
}
}

Câu 9: Trình bày cấu trúc dữ liệu danh sách liên kết đơn. Cài đặt thao tác thêm một phần tử
vào sau phần tử thứ p trong danh sách.
Trả lời:
Danh sách liên kết đơn là một cấu trúc dữ liệu bao gồm một tập các nút, mà mỗi nút bao
gồm:


- Dữ liệu cần lưu trữ.
- Liên kết đến nút tiếp theo.

void ThemNode_VaoSauNode_p(int x, int vt)
{


Node*temp = new Node;
temp->value = x;
temp ->next = NULL;
if(list == NULL){
themCuoi(x); // Nếu DS rỗng tức là thêm vào cuối
}else{
// Bắt đầu tìm vị trí cần chèn. Ta sẽ dùng k để đếm cho vị trí
int k = 0;
Node*p = list;
while(p != NULL && k != vt){
p = p->next;
++k;
}
if(k != vt){
// Nếu duyệt hết danh sách lk rồi mà vẫn chưa đến vị trí cần chèn, ta
sẽ mặc định chèn cuối
themCuoi(x)
}else{
temp->next = p->next;
p->next = temp;
}
}
}


Câu 10: Trình bày cấu trúc dữ liệu danh sách liên kết đơn. Cài đặt thao tác xóa một phần tử ở
đầu danh sách.
Trả lời:
Danh sách liên kết đơn là một cấu trúc dữ liệu bao gồm một tập các nút, mà mỗi nút bao
gồm:

- Dữ liệu cần lưu trữ.
- Liên kết đến nút tiếp theo.

void xoaDau()
{
if (list == NULL)
{
cout << "ko co gi de xoa";
}
else list = list->next;
}

Câu 11: Trình bày cấu trúc dữ liệu danh sách liên kết đơn. Cài đặt thao tác xóa một phần tử ở
cuối danh sách.
Trả lời:
Danh sách liên kết đơn là một cấu trúc dữ liệu bao gồm một tập các nút, mà mỗi nút bao
gồm:
- Dữ liệu cần lưu trữ.
- Liên kết đến nút tiếp theo.

void xoaCuoi()
{
Node*temp = list;
if(list == NULL)
cout << "Danh sach rong" << endl;

while (temp->next->next != NULL)
{
temp = temp ->next;
}

temp->next=NULL;
}


Câu 12: Trình bày cấu trúc dữ liệu danh sách liên kết đơn. Cài đặt thao tác xóa một phần tử vào
sau phần tử thứ p trong danh sách.
Trả lời:
Danh sách liên kết đơn là một cấu trúc dữ liệu bao gồm một tập các nút, mà mỗi nút bao
gồm:
- Dữ liệu cần lưu trữ.
- Liên kết đến nút tiếp theo.

void DelAt(int a){
if(list == NULL)
cout << "khong co gi de xoa"; // Nếu DS rỗng thì khơng có gì để xóa
// Bắt đầu tìm vị trí cần xóa. Ta sẽ dùng k để đếm cho vị trí
int k = 0;
Node*p = list;
while(p!=NULL && k!=a){
p = p->next;
++k;
}
if(k != a){
// Nếu duyệt hết danh sách lk rồi mà vẫn chưa đến vị trí cần chèn, ta sẽ
mặc định xóa cuối
xoaCuoi();
}else{
p->next = p->next->next;
}
}



Câu 13: Trình bày cấu trúc dữ liệu danh sách liên kết đơn. Cài đặt thao tác làm rỗng một danh
sách.
Trả lời:
Danh sách liên kết đơn là một cấu trúc dữ liệu bao gồm một tập các nút, mà mỗi nút bao
gồm:
- Dữ liệu cần lưu trữ.
- Liên kết đến nút tiếp theo.

void RemoveList()
{
Node *temp = list;
while (list!=NULL)
{
temp = temp->next;
delete list;
list = temp;
}
list = NULL;
}

Câu 14: Trình bày khái niệm cấu trúc dữ liệu stack (ngăn xếp). Cài đặt stack bằng mảng. Trình
bày thao tác pop của stack đã cài đặt.
Trả lời:
Ngăn xếp (Stack) là một danh sách mà ta
giới hạn việc thêm vào hoặc loại bỏ một phần tử
chỉ thực hiện tại một đầu của danh sách, đầu này
gọi là đỉnh (top) của ngăn xếp.
Có thể hình dung stack như một chồng đĩa.

Muốn thêm vào chồng đó 1 đĩa ta để đĩa mới trên
đỉnh chồng, muốn lấy các đĩa ra khỏi chồng ta
cũng lấy đĩa trên trước. Như vậy ngăn xếp là một
cấu trúc có tính chất “vào sau – ra trước” – LIFO
Cài đặt stack bằng mảng:
int size = 100;
int top = -1;
int stack[100];
void pop() {
int x;
if (top == -1) {
cout << "khong co gi de lay" << endl;
return;
}
x = stack[top];
top--;
}


Câu 15: Trình bày khái niệm cấu trúc dữ liệu stack (ngăn xếp). Cài đặt stack bằng mảng. Trình
bày thao tác push của stack đã cài đặt.
Trả lời:
Ngăn xếp (Stack) là một danh sách mà ta
giới hạn việc thêm vào hoặc loại bỏ một phần tử
chỉ thực hiện tại một đầu của danh sách, đầu này
gọi là đỉnh (top) của ngăn xếp.
Có thể hình dung stack như một chồng đĩa.
Muốn thêm vào chồng đó 1 đĩa ta để đĩa mới trên
đỉnh chồng, muốn lấy các đĩa ra khỏi chồng ta cũng
lấy đĩa trên trước. Như vậy ngăn xếp là một cấu

trúc có tính chất “vào sau – ra trước” – LIFO
Cài đặt stack bằng mảng:
int size = 100;
int top = -1;
int stack[100];
void push(int x) {
if (top == size) {
cout << "Ngăn xếp đầy, không push được nữa" << endl;
return;
}
top++;
stack[top] = x;
}

Câu 16: Trình bày khái niệm cấu trúc dữ liệu stack (ngăn xếp). Cài đặt stack bằng mảng. Trình
bày thao tác peek của stack đã cài đặt.
Trả lời:
Ngăn xếp (Stack) là một danh sách mà ta
giới hạn việc thêm vào hoặc loại bỏ một phần tử
chỉ thực hiện tại một đầu của danh sách, đầu này
gọi là đỉnh (top) của ngăn xếp.
Có thể hình dung stack như một chồng đĩa.
Muốn thêm vào chồng đó 1 đĩa ta để đĩa mới trên
đỉnh chồng, muốn lấy các đĩa ra khỏi chồng ta
cũng lấy đĩa trên trước. Như vậy ngăn xếp là một
cấu trúc có tính chất “vào sau – ra trước” – LIFO
Cài đặt stack bằng mảng:
int size = 100;
int top = -1;
int stack[100];


int peek() {
if (top == -1)
return -1;
else
return stack[top];
}


Câu 17: Trình bày khái niệm cấu trúc dữ liệu stack (ngăn xếp). Cài đặt stack bằng danh sách liên
kết. Trình bày thao tác pop của stack đã cài đặt.
Trả lời:
Ngăn xếp (Stack) là một danh sách mà ta
giới hạn việc thêm vào hoặc loại bỏ một phần tử
chỉ thực hiện tại một đầu của danh sách, đầu này
gọi là đỉnh (top) của ngăn xếp.
Có thể hình dung stack như một chồng đĩa.
Muốn thêm vào chồng đó 1 đĩa ta để đĩa mới trên
đỉnh chồng, muốn lấy các đĩa ra khỏi chồng ta
cũng lấy đĩa trên trước. Như vậy ngăn xếp là một
cấu trúc có tính chất “vào sau – ra trước” – LIFO.
Cài đặt stack bằng danh sách:
struct Node{
int value;
Node* next;
};
struct Stack{
Node *top;
};
Stack *st = NULL;

Node* pop()
{
Node*x ;
if(st->top!=NULL)
{
Node *temp = st->top;
st->top = st->top->next;
x = temp;
delete(temp);
}
return x;
}


Câu 18: Trình bày khái niệm cấu trúc dữ liệu stack (ngăn xếp). Cài đặt stack bằng danh sách liên
kết. Trình bày thao tác push của stack đã cài đặt.
Trả lời:
Ngăn xếp (Stack) là một danh sách mà ta
giới hạn việc thêm vào hoặc loại bỏ một phần tử
chỉ thực hiện tại một đầu của danh sách, đầu này
gọi là đỉnh (top) của ngăn xếp.
Có thể hình dung stack như một chồng đĩa.
Muốn thêm vào chồng đó 1 đĩa ta để đĩa mới trên
đỉnh chồng, muốn lấy các đĩa ra khỏi chồng ta
cũng lấy đĩa trên trước. Như vậy ngăn xếp là một
cấu trúc có tính chất “vào sau – ra trước” – LIFO.
Cài đặt stack bằng danh sách:
struct Node{
int value;
Node* next;

};
struct Stack{
Node *top;
};
Stack *st = NULL;
void push(int x){
Node*temp = new Node;
temp->value = x;
temp->next = NULL;
if(st->top == NULL){
st->top = temp;
}
else {
temp->next = st->top;
st->top = temp;
}
cout << temp ->value <<" ";


Câu 19: Trình bày khái niệm cấu trúc dữ liệu stack (ngăn xếp). Cài đặt stack bằng danh sách liên
kết. Trình bày thao tác peek của stack đã cài đặt.
Trả lời:
Ngăn xếp (Stack) là một danh sách mà ta
giới hạn việc thêm vào hoặc loại bỏ một phần tử
chỉ thực hiện tại một đầu của danh sách, đầu này
gọi là đỉnh (top) của ngăn xếp.
Có thể hình dung stack như một chồng đĩa.
Muốn thêm vào chồng đó 1 đĩa ta để đĩa mới trên
đỉnh chồng, muốn lấy các đĩa ra khỏi chồng ta
cũng lấy đĩa trên trước. Như vậy ngăn xếp là một

cấu trúc có tính chất “vào sau – ra trước” – LIFO.
Cài đặt stack bằng danh sách:
struct Node{
int value;
Node* next;
};
struct Stack{
Node *top;
};
Stack *st = NULL;
Node* peek()
{
return st->top->value;
}


Câu 20: Trình bày khái niệm cấu trúc dữ liệu stack (ngăn xếp). Trình bày ý tưởng đảo một mảng
số nguyên có sử dụng stack.
Trả lời:
Ngăn xếp (Stack) là một danh sách mà ta
giới hạn việc thêm vào hoặc loại bỏ một phần tử
chỉ thực hiện tại một đầu của danh sách, đầu này
gọi là đỉnh (top) của ngăn xếp.
Có thể hình dung stack như một chồng đĩa.
Muốn thêm vào chồng đó 1 đĩa ta để đĩa mới trên
đỉnh chồng, muốn lấy các đĩa ra khỏi chồng ta
cũng lấy đĩa trên trước. Như vậy ngăn xếp là một
cấu trúc có tính chất “vào sau – ra trước” – LIFO.
Ý tưởng đảo một mảng số nguyên có sử
dụng stack:

- Duyệt từ đầu mảng đến cuối mảng. Lần lượt cho các phần tử duyệt được vào ngăn xếp,
cho hết mảng vào ngăn xếp.
- Lần lượt lấy các phần tử từ ngăn xếp và in ra cho đến khi ngăn xếp rỗng.
Câu 21: Trình bày khái niệm cấu trúc dữ liệu stack (ngăn xếp). Trình bày ý tưởng đảo chuỗi
theo từ có sử dụng stack.
Trả lời:
Ngăn xếp (Stack) là một danh sách mà ta
giới hạn việc thêm vào hoặc loại bỏ một phần tử
chỉ thực hiện tại một đầu của danh sách, đầu này
gọi là đỉnh (top) của ngăn xếp.
Có thể hình dung stack như một chồng đĩa.
Muốn thêm vào chồng đó 1 đĩa ta để đĩa mới trên
đỉnh chồng, muốn lấy các đĩa ra khỏi chồng ta
cũng lấy đĩa trên trước. Như vậy ngăn xếp là một
cấu trúc có tính chất “vào sau – ra trước” – LIFO.
Ý tưởng đảo chuỗi theo từ có sử dụng stack:
- Duyệt từ đầu xâu đến cuối xâu. Lần lượt cho các ký tự duyệt được vào ngăn xếp, cho hết
các ký tự vào ngăn xếp.
- Lần lượt lấy các phần tử từ ngăn xếp và in ra cho đến khi ngăn xếp rỗng.


Câu 22: Trình bày khái niệm cấu trúc dữ liệu stack (ngăn xếp). Trình bày ý tưởng chuyển đổi
một số từ cơ số 10 sang cơ số 2 có sử dụng stack.
Trả lời:
Ngăn xếp (Stack) là một danh sách mà ta
giới hạn việc thêm vào hoặc loại bỏ một phần tử
chỉ thực hiện tại một đầu của danh sách, đầu này
gọi là đỉnh (top) của ngăn xếp.
Có thể hình dung stack như một chồng đĩa.
Muốn thêm vào chồng đó 1 đĩa ta để đĩa mới trên

đỉnh chồng, muốn lấy các đĩa ra khỏi chồng ta
cũng lấy đĩa trên trước. Như vậy ngăn xếp là một
cấu trúc có tính chất “vào sau – ra trước” – LIFO.
Ý tưởng chuyển đổi một số từ cơ số 10 sang
cơ số 2 có sử dụng stack:
- Lấy số cần chuyển chia lấy dư cho cơ số 2 và đẩy vào stack.
- Tiếp tục lấy kết quả của phép chia đó chia cho cơ số 2 cho đến khi kết quả bằng khơng
thì dừng.
- Lấy lần lượt các số trong stack ra ta được số cần tìm.
Câu 23: Trình bày khái niệm cấu trúc dữ liệu stack (ngăn xếp). Trình bày ý tưởng chuyển đổi
một số từ cơ số 10 sang cơ số 16 có sử dụng stack.
Trả lời:
Ngăn xếp (Stack) là một danh sách mà ta
giới hạn việc thêm vào hoặc loại bỏ một phần tử
chỉ thực hiện tại một đầu của danh sách, đầu này
gọi là đỉnh (top) của ngăn xếp.
Có thể hình dung stack như một chồng đĩa.
Muốn thêm vào chồng đó 1 đĩa ta để đĩa mới trên
đỉnh chồng, muốn lấy các đĩa ra khỏi chồng ta
cũng lấy đĩa trên trước. Như vậy ngăn xếp là một
cấu trúc có tính chất “vào sau – ra trước” – LIFO.
Ý tưởng chuyển đổi một số từ cơ số 10 sang
cơ số 16 có sử dụng stack:
- Lấy số cần chuyển chia lấy dư cho cơ số 16 và đẩy vào stack.
- Tiếp tục lấy kết quả của phép chia đó chia cho cơ số 16 cho đến khi kết quả bằng khơng
thì dừng.
- Lấy lần lượt các số trong stack ra, nếu số lấy ra >= 10 thì ta in ra ký tự A, B, C …, F tương
ứng từ 10-15. Khi đó, ta được số cần tìm.



Câu 24: Trình bày khái niệm về cấu trúc dữ liệu queue (hàng đợi). Cài đặt hàng đợi tuyền tính
bằng mảng, DSLK. Trình bày thao tác lấy một phần tử trên hàng đợi tuyến tính (Dequeue).
Trả lời:
Queue: Queue là một danh sách mà các đối tượng đượcbthêm vào ở một đầu của danh
sách và lấy ra ở một đầu kia của danh sách. Vì thế, việc thêm một đối tượng vào Queue hoặc
lấy một đối tượng ra khỏi Queue được thực hiện theo cơ chế FIFO (First In First Out - Vào
trước ra trước). Phần tử được lấy ra ở phần đầu queue (front/ first), và được thêm vào ở cuối
queue (rear/last).

Cài đặt hàng đợi tuyền tính bằng mảng:
int
int
int
int

size = 10;
front = 0;
rear = -1;
queue[10];

void dequeue() {
int x;
if (rear < front) {
cout << "hang doi rong!" << endl;
return;
}
x=queue[front];
queue[front] = 0;
front++;
}


Cài đặt hàng đợi tuyền tính bằng DSLK:
struct Node{
int value;
Node* next;
};
struct Queue{
Node *first;
Node *last;
};
Queue *qu = NULL;
Node* Dequeue (){
Node*temp = qu->first;
if (temp != NULL){
qu->first = qu->first->next;
}
return temp;
}

Câu 25: Trình bày khái niệm về cấu trúc dữ liệu queue (hàng đợi). Cài đặt hàng đợi tuyến tính
bằng mảng. Trình bày thao tác thêm một phần tử vào hàng đợi tuyến tính (Enqueue).


Trả lời:
Queue: Queue là một danh sách mà các đối tượng đượcbthêm vào ở một đầu của danh
sách và lấy ra ở một đầu kia của danh sách. Vì thế, việc thêm một đối tượng vào Queue hoặc
lấy một đối tượng ra khỏi Queue được thực hiện theo cơ chế FIFO (First In First Out - Vào
trước ra trước). Phần tử được lấy ra ở phần đầu queue (front/ first), và được thêm vào ở cuối
queue (rear/last).


Cài đặt hàng đợi tuyền tính bằng mảng:
int
int
int
int

size = 10;
front = 0;
rear = -1;
queue[10];

void enqueue(int x) {
if (rear==size) {
cout << "Hàng đợi đầy!" << endl;
return;
}
rear++;
queue[rear] = x;
}

Cài đặt hàng đợi tuyền tính bằng DSLK:
struct Node{
int value;
Node* next;
};
struct Queue{
Node *first;
Node *last;
};
Queue *qu = NULL;

void put(int x){
Node*temp = new Node;
temp->value = x;
temp->next = NULL;
if (qu->first==NULL){
qu->last = qu->first=temp;
}
else{
qu->last->next=temp;
qu->last = temp;
}
}

Câu 26: Trình bày khái niệm về cây nhị phân tìm kiếm. Cài đặt cây nhị phân tìm kiếm bằng danh
sách liên kết. Trình bày thao tác thêm một node vào cây nhị phân tìm kiếm.


Trả lời:
Cây nhị phân tìm kiếm là một cấu trúc dữ
liệu đặc biệt được sử dụng cho mục đích tìm
kiếm hiệu quả. Một cây nhị phân có một điều
kiện đặc biệt là mỗi nút có thể có tối đa hai nút
con. Các khóa của node trên cây con bên trái
nhỏ hơn khóa của root, khóa của các node trên
cây con bên phải lớn hơn khóa của root. Cây con
bên trái và phải cũng là cây nhị phân tìm kiếm.
Cấu tạo gồm 3 phần:


Node gốc (root): là node bắt đầu hay cịn gọi là "rễ".

Node trong (internal node): là node có ít nhất 1 con.



Node lá (leaf): là node khơng có con.



Cài đặt cây nhị phân tìm kiếm bằng danh sách liên kết.
struct Node{
int value;
Node*left;
Node*right;
};
Node* root = new Node;
void them(Node*root,int x){
Node*t = new Node;
t->value = x;
t->left = NULL;
t->right = NULL;
Node*temp = root;
bool kt = true;
while (kt){
if(temp==NULL){
temp=t;
kt=false;
}
else {
if(temp->value < t->value)
temp = temp->right;

else
temp=temp->left;
}
}
}

Câu 27: Trình bày khái niệm về cây nhị phân tìm kiếm. Cài đặt cây nhị phân tìm kiếm bằng danh
sách liên kết. Trình bày thao tác xóa một node trên cây nhị phân tìm kiếm.
Trả lời:


Cài đặt cây nhị phân tìm kiếm bằng danh sách liên kết.
struct Node{
int value;
Node*left;
Node*right;
};

Node* root = new Node;
void TimNotThe(Node*X, Node*Y){
if(Y->left !=NULL)
TimNotThe(X,Y->left);
else{
X->value = Y->value;
X=Y;
Y = Y->right;
}
}
void XoaNode(Node*root, int x) // x laf giá trị của node cần xóa
{

if (root == NULL)
{
return;
}
else
{
if(x < root->value) // neu x nho hon not goc
{
XoaNode(root->left, x); // duyet sang nhanh trai cua cay
}
else if(x > root->value)
{
XoaNode(root->right,x); //duyet sang nhanh phai cua cay
}
else if(x == root->value) // x == root->value - da tim ra node can xoa
{
Node*temp = root; // temp la node the mang - node de xoa
if (root->left == NULL) //nhanh trai=NULL -> la cay co 1 cay con phai
{
root = root->right; //duyet sang phai cua node can xoa
}
else if(root->right == NULL)//nhanh phai = null -> la cay con trai
{
root = root->left; // duyet sang trai cua node can xoa
}
else{
TimNotThe(temp, root->right);
}
delete temp;
}

}
}

Câu 28: Trình bày khái niệm về cây nhị phân tìm kiếm. Cài đặt cây nhị phân tìm kiếm bằng danh
sách liên kết. Trình bày thao tác tìm một node trên cây nhị phân tìm kiếm.
Trả lời:
Cài đặt cây nhị phân tìm kiếm bằng danh sách liên kết.


struct Node{
int value;
Node*left;
Node*right;
};
Node* root = new Node;

• Sử dụng đệ quy:
Node* SearchNode_Re(Node* root, int x)
{
if (root == NULL)
return NULL;

}

if (root->data == x)
{
return root;
}
if (root->data > x)
{

SearchNode_Re(root->pLeft, x);
}
else
{
SearchNode_Re(root->pRight, x);
}

• Sử dụng vòng lặp:

Node* SearchNode(Node* root, int x)
{
if (root == NULL)
return NULL;
NODE* p = root;

}

while (p != NULL)
{
if (p->data == x)
{
return p;
}
else if (p->data > x)
{
p = p->pLeft;
}
else
{
p = p->pRight;

}
}



×