stack queue

 Bài tập 2: Kiểm tra một xâu kí tự có chứa các dấu ngoặc tương xứng không?

 Thuật toán:

 Sử dụng Stack lưu trữ các dấu ngoặc.

 Duyệt xâu lần lượt qua các dấu ngoặc như sau:

• Nếu gặp '(' thì nạp '(' vào Stack.

• Nếu gặp ')' thì xóa một phần tử ra khỏi Stack.

 Nếu Stack rỗng trước khi duyệt xong xâu hoặc duyệt xong mà Stack vẫn còn phần tử thì xâu đã cho không thỏa mãn, ngược lại thỏa mãn.

Function KiemTraDauNgoacTuongXung

(str: string): boolean;

Var

S: Stack;

n, d: integer;

KiemTra: boolean;

x: char;

Begin

n := length(str);

d := 1;

KiemTra := true;

StackInit(S);

while (d

begin

if str[d] = '(' then PushS(str[d], S)

else

if not EmptyS(S) then PopS(S, x)

else KiemTra := false;

inc(d);

end;

if EmptyS(S) and KiemTra then

KiemTraDauNgoacTuongXung := true

else

KiemTraDauNgoacTuongXung := false;

end;

 Bài tập 3: Dùng các phép toán của hàng đợi và ngăn xếp, viết thuật toán đảo ngược các phần tử của hàng đợi.

 Thuật toán:

 Lấy từng phần tử của Queue nạp vào Stack.

 Hiển thị các phần tử trong Stack.

Procedure DoiNguoc(Q: Queue);

var S: Stack;

x: ElementType;

begin

StackInit(S);

while not EmptyQ(Q) do

begin

PopQ(Q, x);

PushS(S, x);

end;

writeln('Hien thi Q theo thu tu dao nguoc: ');

while not EmptyS(S) do

begin

PopS(S, x);

writeln(x, ' ');

end;

end;

 Bài tập 4: Đọc các kí tự của xâu kí tự vào Stack và Queue. Dùng các phép toán của Stack và Queue kiểm tra xem xâu đó có đối xứng không?

 Thuật toán:

 Đọc các kí tự vào Stack và Queue.

 Duyệt Stack và Queue:

• Lấy phần tử ra khỏi Stack và Queue.

• Nếu hai phần tử vừa lấy ra không bằng nhau thì xâu không đối xứng, thoát.

 Khi duyệt xong nếu không có vấn đề gì thì xâu đã cho đối xứng.

Function DoiXung(xau: string): boolean;

var S: Stack;

Q: Queue;

ch1, ch2: char;

l, i: integer;

begin

StackInit(S);

QueueInit(Q);

l := length(xau);

for I := 1 to l do

begin

PushS(xau[i], S);

PushQ(xau[i], Q);

end;

while not EmptyS(S) do

begin

PopS(S, ch1);

PopQ(Q, ch2);

if (ch1 ch2) then

begin

DoiXung := false;

exit; {Thoat khoi chuong trinh con}

end;

end;

DoiXung := true;

end;

Bài 1: Sử dụng các phép toán căn bản trên Stack: Empty, StackInit, Push, Pop để lập giải thuật:

a) Lấy ra một phần tử ở đáy ngăn xếp nhưng để lại nguyên nội dung còn lại của ngăn xếp.

b) Lấy ra phần tử thứ n (đếm từ trên xuống) của ngăn xếp, nhưng để lại nguyên nội dung còn lại của ngăn xếp.

b) Gợi ý thuật toán bài 1:

a) Để giải bài toán này, trước hết chúng ta khởi tạo 1 ngăn xếp tạm.

b) Để lấy ra phần tử ở đáy mà vẫn bảo toàn các phần tử còn lại, chúng ta dùng ngăn xếp tạm để lưu tạm thời các phần tử nằm trên.

Rồi đẩy chúng vào ngăn xếp ban đầu sau khi đã lấy phần tử ở đáy ngăn xếp ban đầu ra

Procedure Bai1A;

1. StackInit(tam); {khởi tạo một ngăn xếp tạm}

2. {đẩy các phần tử vào ngăn xếp tạm}

while not Empty(S) do begin

Pop(i,S); {Lấy phần tử ở đỉnh của S}

Push(i,Tam); {Đẩy và ngăn xếp tạm}

end;

3.{đẩy phần tử ở đỉnh stack tạm (hay chính là phần tử đáy của stack S) ra khỏi stack}

Pop(i,Tam); write(i:1);

4.{đẩy lần lượt các phần tử từ stack Tạm về lại stack S}

while not Empty(Tam) do

begin

Pop(i, Tam);

Push(i, S);

end;

5.return

Procedure Bai1B;

1. readln(n);{nhập vào một số nguyên dương n}

2. StackInit(tam);

3. Count := 1;

4. {đẩy (n-1) phần tử ra khỏi stack S}

while (not Empty(S) and (count

Pop(i,S);

Push(i,tam);

inc(count);

end;

5. {lấy phần tử thứ n ra khỏi stack S}

Pop(i,S);write(i);

6. {đẩy trả lại các phần tử từ stack Tạm về stack S}

while not Empty(Tam) do begin

Pop(i,Tam};

Push(i,S);

end;

7. return

Bài 2: Sử dụng các phép toán căn bản trên QUEUE: Empty, Create, EnQueue, DeQueue để lập giải thuật:

a) Lấy ra một phần tử ở cuối hàng đợi, nhưng để lại nguyên nội dung còn lại của hàng đợi.

b) Lấy ra phần tử thứ n của hàng đợi, nhưng để lại nguyên nội dung còn lại của hàng đợi.

b) Gợi ý thuật toán bài 1:

a) Để giải bài toán này, trước hết chúng ta khởi tạo 1 ngăn xếp tạm.

b) Để lấy ra phần tử ở đáy mà vẫn bảo toàn các phần tử còn lại, chúng ta dùng ngăn xếp tạm để lưu tạm thời các phần tử nằm trên.

c) Rồi đẩy chúng vào ngăn xếp ban đầu sau khi đã lấy phần tử ở đáy ngăn xếp ban đầu ra.

Bài 2:

Tương tự như lời giải của bài tập 1 cùng với các thao tác trên hàng đợi và sử dụng thêm hàng đợi tạm. Bạn đọc tự tìm hiểu và cài đặt thuật toán.

Bài 1. Viết chương trình nhập vào một xâu kí tự và in ra xâu ngược lại bằng stack.

Bài 2. Cho 6 kí tự sau: (, ), {, }, [, ]. Viết chương trình nhập vào 3 trong 6 kí tự trên rồi in ra các kí tự đối xứng của nó.

Bạn đang đọc truyện trên: AzTruyen.Top

Tags: #queue#stack