迴圈佇列的兩種實現方法

2021-09-14 03:12:14 字數 2451 閱讀 7201

順序儲存結構

示意圖參考嚴蔚敏版《資料結構》。

順序儲存為何宜選迴圈佇列

佇列的順序表儲存中,除了資料域dat

adata

data

,還應附設兩個座標fro

ntfront

front和rea

rrear

rear

用來記錄頭結點和尾結點的位置。對於pop

poppo

p操作,依靠 fro

nt+1

front+1

front+

1 這樣的上移操作來進行。假設佇列中已經有一些元素,經過幾次上移後的佇列大致如下圖所示。

如圖,此時佇列已滿,畫斜線的部分表示被 pop

poppo

p 的元素(這些元素雖然被彈出,但由於是順序表儲存,其實際的記憶體還在)。這時如果想要pus

hpush

push

新的元素,就應該擴大記憶體空間——那些被拋棄的元素所佔的記憶體就這樣被浪費掉了…這顯然不是我們想要的。

是否能迴圈利用?

當然,之前學習過的迴圈鍊錶可以作為參考物件。使用順序儲存結構的話,可以利用求餘這一重要思想來完成迴圈(之前做的演算法題涉及到迴圈的操作有好多都是利用求餘)。當乙個元素被pop

poppo

p後,其所在位置的空間並沒有被釋放,而是被「假設」不存在了——這只體現在fro

ntfront

fron

t標記後移;在空間允許的情況下,新pus

hpush

push

的元素會覆蓋掉之前被pop

poppo

p的元素,一直如是。

這樣的話我們一定要知道乙個確定的max

_siz

emax\_size

max_si

ze。初始時,fro

nt=r

ear=

0front=rear=0

front=

rear

=0,而迴圈佇列下乙個則可以用如下公式表示:

( re

ar+1

)%ma

x_si

ze(rear+1)\%max\_size

(rear+

1)%m

ax_s

ize同樣的,在進行pus

hpush

push

和p op

poppo

p操作時應該分別進行判滿和判空處理。

**

#include

#include

#define max_size 100

#define ok 1

#define error -1

using namespace std;

typedef

int elemtype;

typedef

int status;

typedef

struct

sqqueue;

status queueinit

(sqqueue &sq)

intqueuelength

(sqqueue sq)

status push

(sqqueue &sq, elemtype e)

status pop

(sqqueue &sq, elemtype &e)

intmain()

return0;

}

鏈式儲存結構

**

#include

#include

#define ok 1

#define error -1

using namespace std;

typedef

int elemtype;

typedef

int status;

typedef

struct node lnode;

status initqueue

(lnode *rear)

status enqueue

(lnode *

*rear, elemtype e)

status visit

(lnode *rear)

return ok;

}int

main()

//cout << endl << rear->data;

visit

(rear)

;system

("pause");

return0;

}

迴圈佇列的兩種寫法

首先說一下主要思路 迴圈佇列的關鍵就是區別佇列滿和空的 兩個條件,因為是迴圈佇列,空和滿狀態會是相同的!至於迴圈方式可以採用乙個空閒單位的方式 x 1 maxsize,1其實就浪費了maxsize 1索引儲存的資料。好了不多說看下寫法吧!下面展示一下第一種寫法。第一種寫法,比較普遍,這就是空閒單位法...

RMQ的兩種實現方法

st表實現rmq rmq演算法 range minimum maximum query 是求區間極值的高效演算法,依據所需實現的不同效能可以有多種寫法,這裡主要講基於線段樹和稀疏表 sparse table 的兩種方法 線段樹是維護區間的一類高效資料結構,依據這個特性,我們可以用線段樹實現rmq演算...

兩種常用的佇列

與棧相反,佇列是一種先進先出的線性表。它只允許在表的一端進行插入,而在另一端刪除元素。和線性表類似,佇列也可以有兩種儲存表示。用鍊錶表示的佇列簡稱鏈佇列。下面是帶頭結點的單鏈佇列的實現 1 include 2 include 34 typedef char qelemtype 5 單鏈佇列節點 6 ...