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

ĐỀ CƯƠNG ÔN TẬP MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT pptx

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 (308.82 KB, 40 trang )

Khoa CNTT  Trường CĐCN Việt Đức
ĐỀ CƯƠNG ÔN THI HỌC KỲ 4
Môn: Chuyên ngành ( CTDL & GT)
Khóa: 4_2009-2012_Ngành: Công nghệ thông tin
Lớp: K4 CĐ Tin Khoa: CNTT
ĐỀ CƯƠNG ÔN TẬP MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
Câu số 1
Cho dãy số: 8, 12, 3, 4, 6, 1, 7, 9, 33, 22.
Ứng dụng thuật toán sắp xếp Chọn để sắp xếp dãy số trên.
Giải:
Thuật toán:
type mang = array [1 100] of integer;
var a:mang;
{sx chon}
procedure sapxepchon (var a:mang; n:integer);
var j,k,i:integer; tg:longint;
begin
for i:=1 to n-1 do
begin
k:=i;
for j:=i+1 to n do if a[j]<a[k] then k:=j;
begin
tg:=a[i];
a[i]:=a[k];
a[k]:=tg;
end;
end;
end;
CTDL&GT - 1 -
Khoa CNTT  Trường CĐCN Việt Đức
ví dụ


lượt 8 12 3 4 6 1 7 9 33 22
1 1 12 3 4 6 8 7 9 33 22
2 3 12 4 6 8 7 9 33 22
3 4 12 6 8 7 9 33 22
4 6 12 8 7 9 33 22
5 7 8 12 9 33 22
6 8 12 9 33 22
7 9 12 33 22
8 12 33 22
9 22 33
Kq 1 3 4 6 7 8 9 12 22 33
Câu số 2
Cho dãy số: 8, 12, 3, 4, 6, 1, 7, 9, 33, 22.
Ứng dụng thuật toán sắp xếp Chèn để sắp xếp dãy số trên.
Giải:
Thuật toán sắp xếp chèn
type mang = array [1 100] of integer;
var a:mang;
{sx chen}
procedure sapxepchen (var a:mang; n:integer);
var j,k,i:integer; x:longint;
begin
for i:=2 to n do
begin
x:=a[i];
j:=i-1;
while (x<a[j]) and (j>0) do
begin
a[j+1]:=a[j];
j:=j-1;

a[j+1]:=x;
end;
CTDL&GT - 2 -
Khoa CNTT  Trường CĐCN Việt Đức
end;
end;
ví dụ
Bảng sau ghi lại các giá trị khoá tương ứng với từng bước.
a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]
Ban đầu 8 12 3 4 6 1 7 9 33 22
8 12 3 4 6 6 7 9 33 22
8 12 3 4 4 6 7 9 33 22
8 12 3 3 4 6 7 9 33 22
8 12 12 3 4 6 7 9 33 22
8 8 12 3 4 6 7 9 33 22
Bước 1 1 8 12 3 4 6 7 9 33 22
8 12 12 4 6 7 9 33 22
8 8 12 4 6 7 9 33 22
Bước 2 3 8 12 4 6 7 9 33 22
8 12 12 6 7 9 33 22
8 8 12 6 7 9 33 22
Bước 3 4 8 12 6 7 9 33 22
8 12 12 7 9 33 22
8 8 12 7 9 33 22
Bước 4 6 8 12 7 9 33 22
8 12 12 9 33 22
8 8 12 9 33 22
Bước 5 7 8 12 9 33 22
Bước 6 8 12 9 33 22
12 12 33 22

Bước 7 9 12 33 22
Bước 8 12 33 22
33 33
Bước 9 22 33
Kết quả 1 3 4 6 7 8 9 12 22 33
Câu 3: Cho dãy số: 8,12,3,4,6,1,7,9,33,22. Ứng dụng thuật toán sắp xếp nổi bọn
(bubble sort) để sắp xếp dãy số trên.
Giải:
Thuật toán sắp xếp nổi bọt :
{sx noi bon}
procedure bubblesort (var a:mang; n:integer);
var j,k:integer; tg:longint;
begin
for i:=1 to n-1 do
CTDL&GT - 3 -
Khoa CNTT  Trường CĐCN Việt Đức
begin
{write('luot',i);}
for j:=n downto i+1 do
if a[j]<a[j-1] then
begin
tg:=a[j];
a[j]:=a[j-1];
a[j-1]:=tg;
end;
end;
end;
Bảng sau ghi lại các giá trị khoá tương ứng với từng bước.
a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]
Ban đầu 8 12 3 4 6 1 7 9 33 22

8 12 3 4 6 1 7 9 22 33
8 12 3 4 1 6 7 9 22 33
8 12 3 1 4 6 7 9 22 33
8 12 1 3 4 6 7 9 22 33
8 1 12 3 4 6 7 9 22 33
Bước 1 1 8 12 3 4 6 7 9 22 33
8 3 12 4 6 7 9 22 33
Bước 2 3 8 12 4 6 7 9 22 33
8 4 12 6 7 9 22 33
Bước 3 4 8 12 6 7 9 22 33
8 6 12 7 9 22 33
Bước 4 6 8 12 7 9 22 33
8 7 12 9 22 33
Bước 5 7 8 12 9 22 33
Bước 6 8 12 9 22 33
Bước 7 9 12 22 33
Bước 8 12 22 33
Bước 9 22 33
Kết quả 1 3 4 6 7 8 9 12 22 33
Câu số 4
Cho dãy số: 8, 12, 3, 4, 6, 1, 7, 9, 33, 22.
CTDL&GT - 4 -
Khoa CNTT  Trường CĐCN Việt Đức
Ứng dụng thuật toán sắp xếp Quicksort (nhanh) để sắp xếp dãy số trên.
Giải:
type mang = array [1 250] of longint;
var a:mang;
{ctc hoan vi}
procedure hoanvi(p,q:longint);
var x:longint;

begin
x:=a[i];
a[i]:=a[j];
a[j]:=x;
end;
{ctc sap xep nhanh}
procedure sapxepnhanh( m,l:longint);
var y:longint;
begin
i:=m; j:=l;
y:=a[(i+j) div 2];
while (i<=j) do
begin
while (a[i]<y) do i:=i+1;
while (a[j]>y) do j:=j-1;
if (i<=j) then
begin
hoanvi(a[i],a[j]);
i:=i+1;
j:=j-1;
end;
if (m<j) then sapxepnhanh(m,j);
if (i<l) then sapxepnhanh(i,l);
end;
end;
Chọn chốt là phần tử đầu
lượt 8 12 3 4 6 1 7 9 33 22
CTDL&GT - 5 -
Khoa CNTT  Trường CĐCN Việt Đức
1 [1 7 3 4 6] [8] [12 9 33 22]

2 [1] [7 3 4 6] [8] [9] [12 33 22]
3 [1] [6 3 4] [7] [8] [9] [12] [33 22]
4 [1] [4 3] [6] [7] [8] [9] [12] [22] [33]
5 [1] [3] [4] [6] [7] [8] [9] [12] [22] [33]
Kq 1 3 4 6 7 8 9 12 22 33
Câu số 5
Cho dãy số: 8, 12, 3, 4, 6, 1, 7, 9, 33, 22.
Ứng dụng thuật toán sắp xếp Mergesort (hòa nhập) để sắp xếp dãy số trên.
Giải:
Thuật toán:
{ctc tron 2 mang}
procedure sxtron(var X, Y: mang; a, b, c: Integer);
var j, p: Integer;
begin
p := a; i := a; j := b + 1;
while (i <= b) and (j <= c) do
begin
if X[i] <= X[j] then
begin
Y[p] := X[i]; i:=i+1;
end
else
begin
Y[p] := X[j]; j:=j+1;
end;
p:=p+1;{hoac la:Inc(p):day la ham tu dong tang bien len 1}
end;
if i <= b then
Move(X[i], Y[p], (b - i + 1) * SizeOf(X[1])) {sizeof:tinh kich thuoc cua mang}
else

Move(X[j], Y[p], (c - j + 1) * SizeOf(X[1]));
end;
procedure hoatron(var X, Y: mang; len: Integer);
CTDL&GT - 6 -
Khoa CNTT  Trường CĐCN Việt Đức
var a, b, c: Integer;
begin
a := 1; b := len; c := len * 2;
while c <= n do
begin
sxtron(X, Y, a, b, c);
a := a + len * 2; b := b + len * 2; c := c + len * 2;
end;
if b < n then sxtron(X, Y, a, b, n)
else
if a <= n then
Move(X[a], Y[a], (n - a + 1) * SizeOf(X[1]));
end;
Ví dụ:
lượt 8 12 3 4 6 1 7 9 33 22
1 [8 12] [3 4] [1 6] [7 9] [22 33]
2 [3 4 8 12] [1 6 7 9] [22 33]
3 [1 3 4 6 7 8 9 12] [22 33]
4 1 3 4 6 7 8 9 12 22 33
Kq 1 3 4 6 7 8 9 12 22 33
Câu số 6
Trình bày thuật toán sàng số nguyên tố. Lấy ví dụ minh họa.
Giải:
Thuật toán sàng nguyên tố
- Giới hạn sàng nguyên tố là n. Như vậy ta phải sàng lấy các số nguyên tố từ

1 đến n
- Kiểm tra từ 2 đến n giả sử là số i
- loại bỏ tất cả những số là bội của số i lớn hơn i. Số đầu tiên của dãy này là
số nguyên tố
type mang=array[1 10000] of longint;
var a:mang; n:longint;
procedure sang( n:longint);
var i,j:integer;
begin
for i:=2 to n do
CTDL&GT - 7 -
Khoa CNTT  Trường CĐCN Việt Đức
a[i]:=1;
for i:=2 to n do
if a[i]=1 then
for j:=i to n div i do
a[i*j]:=0;
for i:=2 to n do
if a[i]=1 then
write(' ',i,' ');
end;
Ví dụ: sàng các số nhỏ hơn 60
2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
lượt 1 khi số đầu tiên của dãy là 2 ta loại bỏ được các số là bội của 2 là: 4,
6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50,

52, 54, 56, 58, 60.
lươt 2: số kt là 3 loại bỏ được các số: 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36,
39, 42, 45, 48,51, 54, 57,60.

Tưng tự, số nào chưa bị loại bỏ là số nguyên tố
dãy chưa bị loại bỏ là: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59.
Câu số 7
cho biểu thức toán học sau:
Chuyển biểu thức trên về dạng hậu tố. Ứng dụng stack để tính giá trị của
biểu thức trên.
Giải:
1. Chuyển biểu thức về dạng hậu tố
10 2 + 2 2 + / 3 6 * 9 7 - / + 6 2 – 2 / 8 9 * 15 12 - / - *
2. Ứng dụng Stack để tính biểu thức trên
Đi từ đầu biểu thức đến cuối biểu thức: Nếu là toán hạng thì đẩy vào ngăn
xếp, nếu là toán tử thì lấy phần tử trên cùng top và top-1 thực hiện phép toán của
toán tử giữa toán hạng top-1 và top sau đó đẩy kết quả vào ngăn xếp
CTDL&GT - 8 -
Khoa CNTT  Trường CĐCN Việt Đức
10 2 + 2 2 + / 3 6 * 9 7 - / +
10+2=12 2+2=4 12/4=3 3*6=18 9-7=2 18/2=9 9+3=12
7
2 6 9 9 2
2 2 2 4 3 3 18 1
8
1
8
1
8
9

10 1
0
12 1
2
1
2
12 3 3 3 3 3 3 3 3 12
6 2 - 2 / 8 9 * 1
5
12 - / - * Kq
6-2=4 4/2=2 8*9=72
15-12
=3
72/3
=24
2-24
=-22
12*(-22)
=-264
12
9 1
5
15 3
2 2 8 8 7
2
7
2
72 7
2
2

4
6 6 4 4 2 2 2 2 2 2 2 2
-
22
1
2
1
2
1
2
1
2
1
2
1
2
12 1
2
1
2
12 1
2
1
2
1
2
-
26
4
-

264
Kết quả: -264
Câu số 8
Khái niệm CTC? Nêu ý nghĩa của việc sử dụng CTC? Viết CTC tìm phần
tử lớn nhất trên mảng có sử dụng CTC tính giá trị lớn nhất của 2 số?
CTDL&GT - 9 -
Khoa CNTT  Trường CĐCN Việt Đức
Giải:
1. Khái niệm CTC. Nêu ý nghĩa của việc sử dụng CTC
- Khái niệm CTC
CTC (hay còn gọi là hàm, thủ tục, thủ tục con) là một chuỗi mã để thực thi
một thao tác đặc thù nào đó như một phần của chương trình lớn hơn. Đây là các
câu lệnh được nhóm vào một khối và được đặt tên và tên này tuỳ theo ngôn ngữ có
thể gán với một kiểu dữ liệu. Những khối mã này có thể tập trung lại thành một thư
viện phần mềm. Các CTC có thể được gọi ra để thi hành (thường thông qua tên của
CTC). Điều này có nghĩa là cho phép sử dụng CTC nhiều lần mà không cần viết lại
khối mã, khối mã đó chỉ được viết một lần.
- Ý nghĩa của việc sử dụng CTC
+ Tránh lặp đi lặp lại một đoạn chương trình
+ Giúp chương trình ngắn gọn, dễ sửa đổi bổ sung
+ Có thể sử dụng trong các chương trình khác nếu được tạo vào thư viện.
+ Tránh được việc khai báo nhiều biến trong chương trình chính
2. CTC tìm phần tử lớn nhất trên mảng có sử dụng CTC tính giá trị lớn nhất của 2
số
type mang=array[1 50] of longint;
var a:mang; i:integer;
procedure max_2so( a, b:longint);
begin
if (a>b) then max_2so :=a
else max_2so :=b;

end;
procedure max_mang( a:mang; n:integer);
begin
for i=2 to n do
a[i]=max_2so(a[i-1],a[i]);
max_mang:= a[n-1];
end;
Câu số 9
Trình bày thuật toán phân tích một số nguyên thành tích các thừa số nguyên
tố.
Giải:
- Một số nguyên không là số nguyên tố sẽ là tích của các số nguyên tố
-
Procedure pt_nto(n:integer);
Var d,t :integer;
begin
d :=2; t :=0;
CTDL&GT - 10 -
Khoa CNTT  Trường CĐCN Việt Đức
while(n<>1) do
begin
while(n mod d=0) do
begin
n:=n div d;
if(t=1)then write("*");
t :=1;
write(‘so nguyen to : ‘,d);
end ;
d :=d+1;
end ;

end ;
Câu số 10
Trình bày thuật toán chèn một thành phần mới vào sau một thành phần của
danh sách được trỏ bởi Q.
Giải:
Type pointer=^cell
cell= record
infor: Kieu_du_lieu_ds;
next: pointer;
end;
Procedure insertafter( Q: pointer; var head: pointer; x: kieu_du_lieu_ds);
var p: ponter;
begin
new(p); { Cấp phát bộ nhớ cho p}
p^.infor:=x;
if head=nil then
begin
p^.next:=nil;
head:=p;
end
else
begin
p^.next:=Q^.next;
Q^.next:=p;
CTDL&GT - 11 -
Khoa CNTT  Trường CĐCN Việt Đức
end;
end;
Hoặc
Const max=N

Type queue=record
Front,rear:0 max;
Element:array[1 max] of Item;
End;
Var Q:Queue;
Procedure ADDQueue(x:Item; var q:Queue; var ok:boolean);
Var rear:integer;
Begin
With Q do
If rear=max then ok:=false
Else begin
Rear:=rear+1;
Element[rear]:=x;
Ok:=true;
End;
End;
Câu số 11
Trình bày thuật toán đẩy một giá trị vào Stack và thuật toán loại bỏ một phần
tử khỏi Stack.
Giải:
{Khai bao Stack}
const max=100;
type nx=record
top:integer;
a: array[1 max] of integer;
end;
{ day mot phan tu vao ngan xep}
Procedure them(var s:nx; x:integer);
begin
if(s.top=max) then write(‘Stack da day’)

else
CTDL&GT - 12 -
Khoa CNTT  Trường CĐCN Việt Đức
begin
s.top:=s.top+1;
s.a[s.top]:=x;
end;
end;
{ Loai bo phan tu khoi danh sanh}
Procedure loaibo(var s:nx; var x:integer );
begin
if(s.top=0)then write(‘stack rong’)
else
begin
x:=s.a[s.top];
s.top:=s.top-1;
end;
end;
Câu số 12
Trình bày khái niệm thuật toán và nêu các đặc trưng của thuật toán. Lấy ví
dụ minh họa.
Giải:
Định nghĩa: Thuật toán là một dãy hữu hạn các bước, mỗi bước mô tả chính
xác các phép toán hoặc hành động cần thực hiện để giải quyết vấn đề đặt ra.
Đặc trưng của thuật toán
1. Bộ dữ liệu vào: Mỗi thuật toán cần có một số (có thể bằng 0) dữ liệu vào
(input). Đó là các giá trị cần đưa vào khi thuật toán bắt đầu làm việc. Các dữ liệu
này cần được lấy từ các tập hợp giá trị cụ thể nào đó.
2. Dữ liệu ra: Mỗi thuật toán cần có một hoặc nhiều dữ liệu ra (output). Đó
là các giá trị có quan hệ hoàn toàn xác định với các dữ liệu vào và là kết quả của sự

thực hiện thuật toán.
3. Tính xác định: Mỗi bước của thuật toán cần phải được mô tả một các
chính xác, chỉ có một cách hiểu duy nhất. Hiển nhiên đây là một đòi hỏi rất quan
trọng. Bởi vì, nếu một bước có thể hiểu theo nhiều cách khác nhau, thì cùng một
dữ liệu vào, những người thực hiện thuật toán khác nhau có thể dẫn đến các kết
quả khác nhau. Để đảm bảo được tính xác định thuật toán cần phải được mô tả
trong các ngôn ngữ lập trình. Trong các ngôn ngữ này, các mệnh đề được tạo thành
theo qui tắc cú pháp nghiêm ngặt và chỉ có một ý nghĩa duy nhất.
4. Tính khả thi: Tất cả các phép toán có mặt trong các bước của thuật toán
phải đủ đơn giản. Điều này có nghĩa là, người lập trình có thể thực hiện chỉ bằng
giấy trắng và bút trong khoảng thời gian hữu hạn.
CTDL&GT - 13 -
Khoa CNTT  Trường CĐCN Việt Đức
5.Tính dừng : Với mọi bộ dữ liệu vào thoả mãn các điều kiện của dữ liệu
vào, thuật toán phải dừng lại sau một số hữu hạn các bước cần thực hiện.
Ví dụ : Thuật toán tìm UCLN theo phương pháp chia liên tiếp
Thuật toán
Vào : m, n nguyên dương
Ra : d, ước chung lớn nhất của m và n.
Phương pháp
Bước 1: Tìm r, phần dư của phép chia m cho n
Bước 2: Nếu r = 0, thì d ← n (gán giá trị của n cho d) và dừng lại.
Ngược lại, thì m ← n, n ← r và quay lại bước 1
Tính khả thi: ta chỉ cần thực hiện các phép chia các số nguyên các số
nguyên, các phép gán và các phép so sánh để biết được r = 0 hay r ≠ 0.
Tính dừng: khi thực hiện bước 1 thì giá trị của r nhỏ hơn n, nếu r ≠ 0 thì giá
trị của n ở bước 2 là giá trị của r ở bước trước, ta có n > r = n
1
> r
1

= n
2
> r
2
Dãy
số nguyên dương giảm dần cần phải kết thúc ở 0, do đó sau một số bước nào đó giá
trị của r phải bằng 0, thuật toán dừng.
Câu số 13
Định nghĩa hàng đợi ? Cho ví dụ? Viết CTC đẩy 1 phần tử vào hàng đợi?
Giải:
Định nghĩa hàng đợi
Hàng đợi là một danh sách mà trong đó các thao tác thêm một phần tử vào
trong danh sách được thực hiện ở một đầu này và thao tác lấy ra một phần tử từ
trong danh sách lại được thực hiện ở đầu kia. Như vậy, các phần tử đưa vào trong
hàng đợi trước sẽ được lấy ra trước. Do đó hàng đợi còn gọi là danh sách vào trước
ra trước (FIFO List) và cấu trúc này được gọi là cấu trúc FIFO (First In First Out).
Ví dụ: Xếp hàng mua vé tàu, vé xem phim, vé vào xem bóng đá.
Trình bày thuật toán đẩy một phần tử vào Queue và thuật toán loại bỏ một
phần tử khỏi Queue (hàng đợi ).
Giải:
{Khai báo hàng đợi}
const max=100;
type hd=record
d,c,count:integer;
a:array[1 50] of integer;
end;
procedure khoitao(var q:hd);
CTDL&GT - 14 -
Khoa CNTT  Trường CĐCN Việt Đức
begin

q.count:=0;
q.d:=1;
q.c:=0;
end;
{Them mot phan tu vao hang doi}
Procedure them_hd(var q:hd; x:integer);
begin
if(q.count=max) then write(‘Hang da day:’)
else
begin
q.c:=q.c+1;
q.a[q.c]:=x;
q.count:=q.count+1;
end;
end;
{Loại bo mot phan tu khoi hang doi}
Procedure loai_hd(var q:hd ;x:integer);
begin
if(q.count=0) then write(‘hang doi rong’)
else
begin
x:=q.a[q.d];
if(q.d=q.c) then
begin
q.d:=1;
q.c:=0;
end;
q.d:=q.d+1;
q.count:=q.count+1;
end;

end;
Câu số 14
Định nghĩa ngăn xếp? Cho ví dụ? Viết CTC loại bỏ 1 phần tử khỏi ngăn
xếp?
Giải:
1. Định nghĩa ngăn xếp
Ngăn xếp là một danh sách mà trong dó thao tác thêm một phần tử và thao
tác lấy ra một phần tử từ trong danh sách được thực hiện ở cùng một đầu gọi là
đỉnh ngăn xếp. Như vậy, các phần tử được đưa vào trong ngăn xếp sau sẽ được lấy
ra trước, phần tử đưa vào đầu tiên sẽ được lấy ra cuối cùng. Do đó mà ngăn xếp
CTDL&GT - 15 -
Khoa CNTT  Trường CĐCN Việt Đức
còn gọi là danh sách vào sau ra trước (LIFO List) và cấu trúc này được gọi là cấu
trúc LIFO (Last In First Out).
Ví dụ: Xếp đĩa, mua vé, đổi nhị phân, thập phân.
Trình bày thuật toán đẩy một giá trị vào Stack và thuật toán loại bỏ một phần
tử khỏi Stack.
Giải:
{Khai bao Stack}
const max=100;
type nx=record
top:integer;
a:array[1 max] of integer ;
end;
{ day mot phan tu vao ngan xep}
Procedure them(var S:nx; x:integer);
begin
if (s.top=max) then write(‘Stack da day’)
else
begin

s.top:=s.top+1;
s.a[s.top]:=x;
end;
end;
{Loai bo phan tu khoi danh sanh}
Procedure loaibo(var S:nx; x:integer );
begin
if (s.top=0) then write(‘stack rong’)
else
begin
x=s.a[s.top];
s.top:=s.top-1;
end;
end;
Câu số 15
Định nghĩa biểu thức hậu tố? Cho ví dụ chuyển 1 biểu thức dạng trung tố về
dạng hậu tố? Viết CTC tính giá trị biểu thức dạng hậu tố bằng ngăn xếp?
Giải:
1. Định nghĩa biểu thức hậu tố
Biểu thức dạng hậu tố là biểu thức có toán tử được đặt sau toán hạng 1 và
toán hạng 2.
Ví dụ: Biểu thức ở đạng trung tố:
(a+b)/(c-d)+e*f /(g-h) thì được chuyển sang dạng hậu tố
CTDL&GT - 16 -
Khoa CNTT  Trường CĐCN Việt Đức
a b+ c d - / e f * g h - / +
2. CTC tính giá trị biểu thức dạng hậu tố bằng ngăn xếp
{Khai bao ngan xep}
const max = 100;
type nx =record

top:=0 max;
a: array[1 max] of integer;
end;
{khai bao mang}
type mang=array[1 100] of string;
{CTC day mot phan tu vao ngan xep}
procedure them(var s:nx; x: integer);
{CTC loai bo mot phan tu khoi ngan xep}
procedure loai( var s:nx; x:integer);
{CTC tinh bieu thuc dang hau to}
procedure hauto( a: mang);
var
begin
writeln(‘Nhap bieu thuc dang hau to. Nhan E de ket thuc nhap’);
repeat
write(‘Nhap toan tu hoac toan hang: ‘); readln(a[i]);
val(a[i], x, loi);
if loi<>0 then
them(s,x)
else
begin
loai(s,t);
loai(s,m);
ch=a[i];
case ch of
‘^’ : z:= exp(t*ln(m)); {Z=m^t}
‘*’ : z :=m*t;
‘/’ : z :=m/t;
‘+’ : z :=m+t;
‘-’ : z :=m-t;

end;
them(s,z);
end;
until (upcase(a[i])=’E’);
loai(s,t);
writeln(‘Ket qua cua bieu thuc la: ‘, t);
end;
CTDL&GT - 17 -
Khoa CNTT  Trường CĐCN Việt Đức
Câu số 16
Trình bày thuật toán chèn thêm một phần tử vào mảng đã được sắp xếp sao
cho sau khi chèn mảng không mất tính sắp xếp.
Giải:
- Giả sử chèn X vào mảng a có n phần tử đã sắp xếp tăng
- Trong khi giá trị của mảng ở vị trí cần chèn còn nhỏ hơn giá trị của X thì vị
trí được tăng lên 1 sẽ được vị trí chèn
- Khi chèn X thì mảng mới có n+1 phần tử. Khi vị trí còn nhỏ hơn n+1 thì chuyển
các phần tử về phía sau for i=n downto i>vt do a[i]=a[i-1];
Thuật toán:
type mang=[1 100] of real;
var a:mang;
{Chen vao mang}
Procedure chen(a:mang; var n: integer; x:real);
Var i,vt:integer;
begin
vt:=0;
while (a[vt]<x) do vt:=vt+1;
for i:=n downto i>vt do
a[i]:=a[i-1];
a[vt]:=x;

n:=n+1;
end;
Câu số 17
Trình bày thuật toán ghép 2 mảng đã được sắp xếp thành một mảng mới
được sắp xếp.
Giải:
- G/sử ghép 2 mảng a có n phần tử và mảng b có m phần tử được sắp
xếp tăng
- Dùng mảng c để lưu mảng sau khi trộn. Mảng c có n+m phần tử
- So sánh 2 phần tử đầu của mảng a và mảng b. phần tử nào nhỏ hơn
được đưa vào mảng c và loại bỏ phần tử đó khỏi mảng gốc. tiếp tục
cho đến khi loại bỏ hết phần tử ở một mảng a hoặc b.
- Chuyển phần tử còn lại vào mảng c
CTC trộn 2 mảng theo ý tưởng trên:
{ctc tron}
type mang=array[1 100] of real;
CTDL&GT - 18 -
Khoa CNTT  Trường CĐCN Việt Đức
procedure tron(a:mang; n:integer; b:mang; m:integer; c: mang);
var i,j,t,k:integer;
begin
i:=0; j:=0; k:=0;
while (i<n and j<m) do
if(a[i]<=b[j])
begin
c[k]:=a[i];
i:=i+1;
k:=k+1;
end
else

begin
c[k]:=b[j];
j:=+1;
k:=k+1;
end;
{mot trong 2 mang da het}
If (i>=n) then
For t:=0 to m-j do
c[k+t] :=b[j+t];
else
for t :=0 to n-i do
c[k+t] :=a[i+t];
end ;
Cách 2:
- Sử dụng chương trình chèn một phần tử vào mảng
- Khi đó sẽ chèn lần lượt từng phần tử của mảng b vào mảng a.
CTC
Type mang=array[1 100] of real;
{Chen vao mang}
Procedure chen(var a:mang; var n: integer; x:real);
Var i,vt:integer;
begin
vt:=0;
while (a[vt]<x) do vt:=vt+1;
for i:=n downto i>vt do
CTDL&GT - 19 -
Khoa CNTT  Trường CĐCN Việt Đức
a[i]:=a[i-1];
a[vt]:=x; n:=n+1;
end;

{ Tron}
Procedure tron(var a:mang; n: integer; b:mang;m: integer);
Var i:integer;
begin
for i=0 to i<m do
chen(a,n,b[i]);
end;
Câu số 18
Mô tả cách dùng ngăn xếp để chuyển đổi cơ số? Viết CTC chuyển đổi 1 số
từ hệ thập phân sang hệ nhị phân dùng ngăn xếp?
Giải:
1. Mô tả cách dùng ngăn xếp để chuyển đổi cơ số
Ta dùng một stack (ngăn xếp) để lưu trữ số dư qua từng phép chia: Khi thực
hiện phép chia thì nạp số dư vào ngăn xếp. Sau đó lấy chúng lần lượt từ ngăn xếp
ra để hiển thị sẽ được số cần chuyển đổi.
2. CTC chuyển đổi 1 số từ hệ thập phân sang hệ nhị phân dùng ngăn xếp
const max=100;
type nx=record
top:integer;
a:aray[1 max] of integer;
end;
{ them vao nx}
Procedure them(var s:nx; x:integer);
begin
if(s.top=max) then write(‘Stack da day’)
else
begin
s.top:=s.top+1;
s.a[s.top]:=x;
end;

end;
{loai bo}
Procedure loaibo(var S:nx; var x:integer );
begin
if(s.top=0) then write(‘stack rong’)
else
begin
x:=s.a[s.top];
CTDL&GT - 20 -
Khoa CNTT  Trường CĐCN Việt Đức
s.top :=s.top-1;
end ;
end ;
{chuyen doi}
Procedure chuyen_cs(x :integerx) ;
Var Y:integer; s:nx ;
begin
s.top:=0;
while (x<>0) do
begin
y:=x mod 2;
them(s,y);
x:=x div 2;
end;
write(‘So do duoc doi sang he nhi phan: ’);
while (s.top>0) do
begin
loaibo(s,y);
write(‘kq’,y);
end ;

end ;
Câu số 19
Trình bày thuật toán chèn thêm một nút mới vào cây tìm kiếm nhị phân. Lấy
ví dụ minh họa.
Giải:
Việc thêm một một nút có trường khoá bằng x vào cây phải đảm bảo điều
kiện ràng buộc của Cây TKNP. Ta có thể thêm vào nhiều chỗ khác nhau trên cây,
nhưng nếu thêm vào một nút lá sẽ là tiện lợi nhất do ta có thể thực hiện quá trình
tương tự như thao tác tìm kiếm. Khi kết thúc việc tìm kiếm cũng chính là lúc tìm
được chỗ cần chèn.
Giải thuật đệ quy
Type keytype =array[1 max] of real; {kiểu dữ liệu của mỗi nút}
Tree = ^ node;
Node = record
Info : keytype;
Left, Right : Tree;
end;
Procedure Insert (var Root :Tree; x: kkeytype);
Var p : tree;
CTDL&GT - 21 -
Khoa CNTT  Trường CĐCN Việt Đức
Begin
New(p);{Tạo ra nút mới}
P^.info := x;
if root=nil then
begin
Root :=p;
P^.left:= nil;s
P^.right:= nil;
End

Else
with Root^ do
if x> info then insert (Right, x)
else if x < info then insert (left, x);
End;
Giải thuật lặp
Trong thủ tục này ta sử dụng biến con trỏ địa phương q chạy trên các đỉnh
của cây bắt đầu từ gốc. Khi đang ở một đỉnh nào đó, q sẽ xuống đỉnh con trái
(phải) tuỳ theo khoá ở đỉnh lớn hơn (nhỏ hơn) khoá x. Ở tại một đỉnh nào đó khi p
muốn xuống đỉnh con trái (phải) thì phải kiểm tra xem đỉnh này có đỉnh con trái
(phải) không. Nếu có thì tiếp tục xuống, ngược lại thì treo đỉnh mới vào bên trái
(phải) đỉnh đó. Điều kiện q = nil sẽ kết thúc vòng lặp. Quá trình này được lại lặp
khi có đỉnh mới được chèn vào.
procedure Insert (var Root : Tree; x: keytype)
var p, q : tree;
begin
New(p);
P^.info :=x;
if Root = nil then
Begin
Root:=p;
P^.left:= nil;
P^.right:= nil;
End
Else
Begin
q:=Root;
while q <> nil do
if x < q^.info then
if q^.left <> nil then q := q^.left

CTDL&GT - 22 -
Khoa CNTT  Trường CĐCN Việt Đức
else begin
q^.left :=p;
p := nil;
end
else if x > q^.info then
if q^.right <> nil then q:=q^.right
else begin
q^.right :=p;
q =nil;
end;
end;
end;
Ví dụ: Để dựng được cây TKNP ứng với một dãy khoá đưa vào bằng cách
liên tục bổ các nút ứng với từng khoá, bắt đầu từ cây rỗng. Ban đầu phải dựng lên
cây với nút gốc là khoá đầu tiên sau đó đối với các khoá tiếp theo, tìm trên cây
không có thì bổ sung vào.
Ví dụ với dãy khoá: 42 23 74 11 65 58 94 36 99 87
thì cây nhị phân tìm kiếm dựng được sẽ có dạng ở hình dưới đây
Trình bày thuật loại bỏ một nút khỏi cây tìm kiếm nhị phân. Lấy vi dụ minh
họa.
Giải:
Đối lập với phép toán chèn vào là phép toán loại bỏ. Chúng ta cần phải loại
bỏ khỏi Cây TKNP một đỉnh có khoá x (ta gọi tắt là nút x) cho trước, sao cho việc
huỷ một nút ra khỏi cây cũng phải bảo đảm điều kiện ràng buộc của Cây TKNP.
Có ba trường hợp khi huỷ một nút x có thể xảy ra:
• X là nút lá
• X là nút nửa lá ( chỉ có một con trái hoặc con phải)
• X có đủ hai con (trường hợp tổng quát)

Trường hợp thứ nhất: chỉ đơn giản huỷ nút x vì nó không liên quan đến
phần tử nào khác.
CTDL&GT - 23 -
23
74
42
42
11
36
6
5
94
58
99
87
Khoa CNTT  Trường CĐCN Việt Đức
Trường hợp thứ hai: Trước khi xoá nút x cần móc nối cha của x với nút
con (nút con trái hoặc nút con phải) của nó
Trường hợp tổng quát: khi nút bị loại bỏ có cả cây con trái và cây con
phải, thì nút thay thế nó hoặc là nút ứng với khoá nhỏ hơn ngay sát trước nó (nút
cực phải của cây con trái nó) hoặc nút ứng với khoá lớn hơn ngay sát sau nó (nút
cực trái của cây con phải nó). Như vậy ta sẽ phải thay đổi một số mối nối ở các
nút:
• Nút cha của nút bị loại bỏ
• Nút được chọn làm nút thay thế
• Nút cha của nút được chọn làm nút thay thế
Thủ tục xoá một nút được trỏ bởi con trỏ q
Type keytype =[1 max] of real;{kiểu dữ liệu của mỗi nút}
Tree = ^ node;
Node = record

Info : keytype;
Left, Right : Tree;
end;
procedure Del (var Q: Tree); {xoá nút trỏ bởi Q}
var T, S : Tree;
begin
P := Q; {Xử lý trường hợp nút lá và nút nửa lá}
if P
^
.left = nil then
Begin
Q:=P
^
.right ;{R
^
.left := P
^
.right}
Dispose(P);{Đây là thủ tục thu hồi bộ nhớ của biến động}
end
else
if P
^
.right = nil then
begin
Q :=P
^
.left;
Dispore (P);
end

else { Xử lý trường hợp tổng quát}
begin
T := P
^
.left;
if T
^
.right = nil then
begin
T
^
.right := P
^
.right;
Q := T;
Dispose (P);{Đây là thủ tục thu hồi bộ nhớ của biến
động}
CTDL&GT - 24 -
Khoa CNTT  Trường CĐCN Việt Đức
end
else
begin
S := T
^
.right; {Tìm nút thay thế, là nút cực phải của cây }
while S
^
.right <> nil do
begin
T := S;

S := T
^
.right;
end;
S
^
.right := P
^
.right;
T
^
.right := S
^
.left;
S
^
.left := P
^
.left;
Q:=S;
Dispose(p);{Tìm nút thay thế, là nút cực phải của cây }
end;
end;
end;
Thủ tục xoá nút dữ liệu bằng X
Tìm đến nút có trường dữ liệu bằng X
Áp dụng thủ tục Del để xoá
Sau đây chúng ta sẽ viết thủ tục loại khỏi cây gốc Root đỉnh có khoá x cho
trước. Đó là thủ tục đệ qui, nó tìm ra đỉnh có khoá x, sau đó áp dụng thủ tục Del để
loại đỉnh đó ra khỏi cây.

procedure Delete (var Root :Tree ; x : keytype);
begin
if Root <> nil then
if x < Root
^
.info then Delete (Root
^
.left, x)
else if x > Root
^
.info then Delete (Root
^
.right, x)
else Del(Root);
end;
Ví dụ:
CTDL&GT - 25 -
T
5
A
B
T
4
C
E
T
2
T
3
T

1
R
Q
T
S
a) Cây trước khi xoá nút trỏ bởi Q
T
5
A
E
B
T
4
C
T
2
T
1
R
Q
T
S
T
3
b) Cây sau khi xoá nút trỏ bởi Q

×