第三章 棧和佇列

2021-06-26 17:21:21 字數 3215 閱讀 4152

棧和佇列

一、      棧

1、        棧的定義:棧是限定僅在表尾進行插入和刪除操作的線性表,允許插入和刪除的一端稱為棧頂,另一端稱為棧底,不含任何資料元素的棧稱為空棧。

2、        在任何時候出棧的元素都只能是棧頂元素,即最後最後入棧者最先出棧。所以棧中元素除了具有線性關係外,還具有後進先出的特性。

3、        棧的抽象資料型別定義:

adt stack

data

棧中元素具有相同型別及後進先出特性,相鄰元素具有前驅和後繼關係

operation

initstack

前置條件:棧不存在

輸入:無

功能:棧的初始化

輸出:無

後置條件:構造乙個空棧

destroystack

前置條件:棧已存在

輸入:無

功能:銷毀棧

輸出:無

後置條件:釋放棧所占用的儲存空間

push

前置條件:棧已存在

輸入:元素值x

功能:入棧操作,在棧頂插入乙個元素x

輸出:如果插入不成功,則丟擲異常

後置條件:如果插入成功,則棧頂增加乙個元素

pop前置條件:棧已存在

輸入:無

功能:出棧操作,刪除棧頂元素

輸出:如果刪除成功,返回被刪元素值,否則,丟擲異常

後置條件:如果刪除成功,則棧頂減少了乙個元素

gettop

前置條件:棧已存在

輸入:無

功能:取棧頂元素,讀取當前的棧頂元素

輸出:若棧不空,返回當前的棧頂元素值

後置條件:棧不變

empty

前置條件:棧已存在

輸入:無

功能:判空操作,判斷棧是否為空

輸出:如果站為空,返回1,否則返回0

後置條件:棧不變

endadt

4、        棧的順序儲存結構稱為順序棧

(1)    順序棧入站演算法push

template

void seqstack::push(dt x)

if(top==stacksize-1)throw」上溢」;

data[++top]=x;

(2)    順序棧出棧演算法pop

template

dt seqstack::pop()

if(top==-1)throw」下溢」;

(3)    兩棧共享空間入棧演算法push

template

void bothstack::push(int i,dtx)

if(top1==top2-1)throw」上溢」;

if(i==1)data[++top1]=x;

if(i==2)data[--top2]=x;

(4)    兩棧共享空間出棧演算法pop

template

dt bothstack::pop(int i)

if(i==1){

if(top1==-1)throw」下溢」;

return data[top1--];

if(i==2){

if(top2==stacksize)throw」下溢」;

return data[top2++];

5、        棧的鏈結儲存結構稱為鏈棧

(1)    鏈棧入棧演算法push

template

void linkstack::push(dt x)

s=new node;s->data=x;

s->next=top;top=s;

(2)    鏈棧入棧演算法pop

template

dtlinkstack::pop()

if(top==null)throw」下溢」;

x=top->data;p=top;

top=top->next;

delete p;

return x;

二、      佇列

6、        佇列的定義:佇列是只允許在一端進行插入操作,在另一端進行刪除操作的線性表。允許插入的一端稱為隊尾,允許刪除的一端稱為對頭。佇列中的元素除了具有線性關係外,還具有先進先出的特性。

7、        佇列的順序儲存結構­­----迴圈佇列

(1)    迴圈隊列入隊演算法enqueue

template

void cirqueue ::enqueue(dt x)

if((rear+1)%queuesize==front)throw」上溢」;

rear=(rear+1)% queuesize;

data[rear]=x;

(2)    迴圈佇列出隊演算法dequeue

template

dt cirqueue::dequeue()

if(rear==front)throw」下溢」;

front=(front+1) % queuesize;

return data[front];

(3)    讀取隊頭元素演算法getqueue

template

dt cirqueue:: getqueue()

if(rear==front)throw」下溢」;

i=(front+1) % queuesize;

return data[i];

8、        佇列的鏈結儲存結構----鏈佇列

(1)    鏈佇列建構函式演算法linkqueue

template

linkqueue::linkqueue()

{s=new node;s->next=null;

front=rear=s;

(2)    鏈隊列入隊演算法enqueue

template

void linkqueue::enqueue(dt x)

s=new node;s->data=x;

s->next=s;

rear=s;

(3)    鏈佇列出隊演算法dequeue

template

dt linkqueue::dequeue()

if(rear==front)throw」下溢」;

p=front->next;x=p->data;

front->next=p->next;

if(p->next==null)rear=front;

delete p;

return x;

第三章 棧和佇列

棧和佇列是兩種常用的資料結構,同時又是操作受限的線性表,也是兩種重要的抽象資料型別。1 1棧是限定僅在表尾進行插入和刪除操作的線性表。棧中元素具有線性關係和後進先出的特性。2雖然對插入和刪除操作的位置限制減少了棧的靈活性,但同時也使得棧的操作更有效更容易實現。3棧的儲存結構分兩種,一種是順序儲存結構...

第三章 棧和佇列

第三章棧和佇列 一 棧1.棧 限定僅在表尾進行插入和刪除操作的線性表 允許插入和刪除的一端稱為棧頂 另一端稱為棧底 2.空棧 不含任何資料元素的棧。3.在任何時候出棧的元素都只能是棧頂元素,即最後入棧者最先出棧,具有後進先出的特性。4.棧的抽象資料型別定義 1 push 輸入 元素值 x 輸出 如果...

第三章 棧和佇列

3.1 棧 3.1.1 棧的邏輯結構 1.棧 限定僅在表的一端進行插入和刪除操作的線性表。允許插入和刪除的一端稱為棧頂,另一端稱為棧底。空棧 不含任何資料元素的棧。棧的操作特性 後進先出 注意 棧只是對錶插入和刪除操作的位置進行了限制,並沒有限定插入和刪除操作進行的時間。2.棧的抽象資料型別定義 a...