順序儲存結構
示意圖參考嚴蔚敏版《資料結構》。
順序儲存為何宜選迴圈佇列?
佇列的順序表儲存中,除了資料域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 ...