IỊ4.3. Tổ chức hàng đợi bằng danh sách vòng

Một phần của tài liệu MỘT số vấn đề về KIỂU dữ LIỆU TRỪU TƯỢNG (Trang 34)

Chương II: DANH SÁCH TUYẾN TÍNH

IỊ4.3. Tổ chức hàng đợi bằng danh sách vòng

10 phần tử, ta thấy rằng nếu thực hiện 6 lần thao tác Push, rồi 4 lần thao tác Pop, rồi tiếp tục 8 lần thao tác Push nữa thì không có vấn đề gì xảy ra với Stack nhưng sẽ gặp thông báo lỗi tràn mảng đối với Queuẹ

Lý do dẫn đến lỗi trên là do chỉ số cuối hàng đợi rear luôn tăng lên và không bao giờ giảm đi cả. Đó chính là nhược điểm mà ta nói tới khi cài đặt: Chỉ có các phần tử từ vị trí front tới vị trí rear là thuộc hàng đợi, các phần tử từ vị trí 1 tới front-1 là vô nghĩạ

Để khắc phục điều này, ta có thể biểu diễn hàng đợi bằng một danh sách vòng (dùng mảng hoặc danh sách nối vòng đơn): coi như các phần tử của hàng đợi được xếp quanh vòng tròn theo một chiều nào đó (chẳng hạn chiều kim đồng hồ). Các phần tử nằm trên phần cung tròn từ vị trí front tới vị trí rear là các phần tử của hàng đợị Có thêm một biến n lưu số phần tử trong hàng đợị Việc đẩy thêm một phần tử vào hàng đợi tương đương với việc ta dịch chỉ số rear theo chiều vòng một vị trí rồi đặt giá trị mới vào đó. Việc lấy ra một phần tử trong hàng đợi tương đương với việc lấy ra phần tử tại vị trí front rồi dịch chỉ số front theo chiều vòng.

Hình vẽ sau mô tả cách dùng danh sách vòng để mô tả hàng đợi:

Hình 9

Để tiện cho việc dịch chỉ số theo vòng, khi cài đặt danh sách vòng bằng mảng, người ta thường dùng cách đánh chỉ số từ 0 để tiện sử dụng phép lấy dư (modulus – mod).

Const max = 1000; {Dung lượng cực đại} Type

Telement = integer; {Kiểu giá trị một phần tử} TQueue = record

Items: array[0..max-1] of TElement; Front: integer;

Rear: integer; N : integer; End;

Var Queue: TQueue;

Các thao tác cơ bản trên hàng đợi được cài đặt bằng ngôn ngữ lập trình Free Pascal như sau:

program Caidathangdoibangdsvong; uses crt; const max = 1000; type TElement = integer; TQueue = record

items: array[0..max-1] of Telement; front: integer; rear: integer; n : integer; end; var Queue: TQueue;

Procedure init(var Q: TQueue); begin

Q.front:= 1; Q.rear:= max-1; Q.n:=0;

end;

Function IsEmpty(var Q: TQueue): Boolean; begin

end;

Function IsFull(var Q: TQueue): Boolean; begin

IsFull:= (Q.n = max); end;

Function Get(var Q: TQueue): TElement; begin

if IsEmpty(Q) then write('Queue rong!') else Get:= Q.items[Q.front];

end;

Procedure Push(x: TElement; var Q: TQueue); begin

if IsFull(Q) then write('Queue day!') else

with Q do begin

rear:= (rear + 1) mod max; items[rear]:= x;

inc(n); end;

end;

Function Pop(var Q: TQueue): TElement; begin

if IsEmpty(Q) then write('Queue rong!') else

with Q do begin

Pop:= items[front];

front:= (front + 1) mod max; end;

end;

procedure Test; const r = 100;

var i,x,nn,k: integer;

a: array[1..max] of TElement; begin Init(Queue); randomize; nn:= 10; For i:=1 to nn do begin x:= random(r); Push(x,Queue); end;

writeln('Cac phan tu thuoc hang doí); with Queue do

for i:=front to rear do write(items[i], ' '); readln;

k:= 0;

While not IsEmpty(Queue) do begin x:= Pop(Queue); if x mod 2 = 0 then begin k:= k+1; a[k]:= x; end; end; writeln; writeln;

end; BEGIN clrscr; Test; END.

IỊ4.4. Tổ chức hàng đợi bằng danh sách nối đơn kiểu FIFO

Tương tự như cài đặt ngăn xếp bằng biến động và con trỏ trong một danh sách nối đơn, ta cũng không viết hàm IsFull để kiểm tra hàng đợi đầỵ

type TElement = integer; PElem = ^Elem; Elem = record val: TElement; next: PElem; end; var

front, rear: PElem; {Con trỏ tới phần tử đầu và cuối hàng đợi}

procedure Init; begin

front:= Nil; end;

Function IsEmpty: boolean; begin

IsEmpty:= (front=Nil); end;

Function Get: TElement; begin

If IsEmpty then write('Stack rong') else Get:= (front^.val);

end;

Procedure Push(x: Telement); var p: PElem;

begin

New(p); p^.val:= x; p^.next:= nil;

if front = nil then front:= p else rear^.next:= p; rear:= p;

end;

Function Pop: TElement; var p: PElem;

begin

If IsEmpty(top) then write('Stack rong') else begin Pop:= front^.val; p: front^.next; dispose(front); front := p; end; end;

Chương III

Một phần của tài liệu MỘT số vấn đề về KIỂU dữ LIỆU TRỪU TƯỢNG (Trang 34)

Tải bản đầy đủ (DOC)

(76 trang)
w