棧和隊列都是動態(tài)集合裳食,且在其上進行delete操作所移除的元素都是預(yù)先設(shè)定的或衡。在棧(stack)中,被刪除的是最近插入的元素宣增,其實現(xiàn)的是一種后進先出策略玫膀,而在隊列中,被刪除的總是在集合中存在時間最長的那個元素爹脾。隊列實現(xiàn)的是一種先進先出策略帖旨。
棧(堆盤子)
棧上的insert操作稱為壓入(push),無元素參數(shù)的delete操作稱為彈出(POP)灵妨。要查詢一個棧是否為空解阅,可以以用STACK-EMPTY操作,如果對一個空棧進行POP操作泌霍,則稱為棧下溢(錯誤),如果棧頂超過了n,則稱棧上溢朱转。用數(shù)組S[1,2,···n]來實現(xiàn)一個最多可容納n個元素的棧藤为,S.top指向最新插入的元素,棧中包含的元素為S[1分别,···窿吩,S.top]纫雁,其中S[1]是棧底元素轧邪,S[S.top]是棧頂元素。
棧的幾種操作:
STACK-EMPTY
if S.top==0;
return TRUE;
else return FALSE;
PUSH(S,x)
S.top=S.top+1;
S[S.top]=x;
POP(S)
if STACK-EMPTY(S)
error("underflow")
else S.top=S.top-1;
return S[S.top+1];
隊列(顧客排隊)(環(huán)繞式)
隊列上的INSERT操作稱為入隊(ENQUEUE)曲管,DELETE操作稱為出隊(DEQUEUE)院水。類似棧的POP操作一樣简十,DEQUEUE操作也沒有元素參數(shù)。 數(shù)組Q[1恢恼,···胰默,n]來實現(xiàn)一個最多容納n-1個元素的隊列。Q.head指向?qū)︻^元素漏隐,Q.tail指向下一個新元素將要插入的位置碟刺,當(dāng)Q.head=Q.tail時,隊列為空爽柒。若Q.head=Q.tail=1者填,如果試圖從空隊列中刪除一個元素,則隊列發(fā)生下溢心墅。若Q.head=Q.tail+1怎燥,隊列時滿的铐姚,此時若試圖插入一個元素肛捍,則隊列發(fā)生上溢。
隊列的幾種操作:
ENQUEUE(Q,x)
Q[Q.tail]=x;
if Q.tail==Q.length;
Q.tail=1;
else
Q.tail=Q.tail+1;
DEQUEUE(Q)
x=Q[Q.head];
if Q.head=Q.length;
Q.head=1;
else
Q.head=Q.head+1;
return x;
鏈表(其中的各對象按線性順序排列)
數(shù)組的線性順序是由數(shù)組下標(biāo)決定的棺禾,然而與數(shù)組不同的是峭跳,鏈表的順序是由各個對象里的指針決定的。
雙向鏈表
雙向鏈表L的每一個元素都是一個對象竣付,每個對象有一個關(guān)鍵字key和兩個指針古胆,next和prev筛璧。對象中還可以包含其他輔助數(shù)據(jù)(或稱為衛(wèi)星數(shù)據(jù))夭谤。設(shè)x為鏈表的一個元素棺牧,x.next指向它在鏈表中的后繼元素朗儒,x.prev則指向它的前驅(qū)元素颊乘。若干x.prev為NULL醉锄,則是鏈表中的第一個元素乏悄,即鏈表的頭恳不,若x.next=NULL檩小,則為鏈表的尾。屬性L.head指向鏈表的頭烟勋,若L.head=MULL规求,則鏈表L為空卵惦。
單向鏈表:省略prev指針
以排序鏈表
循環(huán)鏈表
鏈表的操作
LIST-SEARCH
x=L.head;
while x!=NULL&&x.key!=k;
x=x.next;
return x;
LIST-INSERT(L.x)
x.next=L.head;
if L.head!=NULL;
L.head.prev=x;
L.head=x;
x.prev=NULL;
LIST-DELETE
if x.prev!=NULL;
x.prev.next=x.next;
else L.head=x.next;
if x.next!=NULL;
x.next.prev=x.prev;