資料結構 棧和佇列

2021-10-07 13:01:23 字數 4393 閱讀 8444

1.1棧的概念及結構

棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行資料插入和刪除操作的一端稱為棧頂,另一端稱為棧底。棧中的資料元素遵守後進先出lifo(last in first out)的原則。

壓棧:棧的插入操作叫做進棧/壓棧/入棧,入資料在棧頂。

出棧:棧的刪除操作叫做出棧。出資料也在棧頂。

1.2棧的實現

棧的實現一般可以使用陣列或者鍊錶實現,相對而言陣列的結構實現更優一些。因為陣列在尾上插入資料的代價比較小。

// 下面是定長的靜態棧的結構,實際中一般不實用,所以我們主要實現下面的支援動態增長的棧

typedef

int stdatatype;

#define n 10

typedef

struct stack

stack;

// 支援動態增長的棧

typedef

int stdatatype;

typedef

struct stack

stack;

// 初始化棧

void

stackinit

(stack* ps)

;// 入棧

void

stackpush

(stack* ps, stdatatype data)

;// 出棧

void

stackpop

(stack* ps)

;// 獲取棧頂元素

stdatatype stacktop

(stack* ps)

;// 獲取棧中有效元素個數

intstacksize

(stack* ps)

;// 檢測棧是否為空,如果為空返回非零結果,如果不為空返回0

intstackempty

(stack* ps)

;// 銷毀棧

void

stackdestroy

(stack* ps)

;

2.1佇列的概念及結構

佇列:只允許在一端進行插入資料操作,在另一端進行刪除資料操作的特殊線性表,佇列具有先進先出fifo(first in first out)。

入佇列:進行插入操作的一端稱為隊尾。

出佇列:進行刪除操作的一端稱為隊頭。

2.2佇列的實現

佇列也可以陣列和鍊錶的結構實現,使用鍊錶的結構實現更優一些,因為如果使用陣列的結構,出佇列在陣列頭上出資料,效率會比較低。

// 鏈式結構:表示佇列

typedef

struct qlistnode

qnode;

// 佇列的結構

typedef

struct queue

queue;

// 初始化佇列

void

queueinit

(queue* q)

;// 隊尾入佇列

void

queuepush

(queue* q, qdatatype data)

;// 隊頭出佇列

void

queuepop

(queue* q)

;// 獲取佇列頭部元素

qdatatype queuefront

(queue* q)

;// 獲取佇列隊尾元素

qdatatype queueback

(queue* q)

;// 獲取佇列中有效元素個數

intqueuesize

(queue* q)

;// 檢測佇列是否為空,如果為空返回非零結果,如果非空返回0

intqueueempty

(queue* q)

;// 銷毀佇列

void

queuedestroy

(queue* q)

;

2.3設計迴圈佇列

解題思路:

1.通過乙個定長陣列實現迴圈佇列;

2.入隊:首先要判斷佇列是否已滿,再進行入隊的操作,入隊操作需要考慮索引迴圈的問題,當索引越界,需要讓它變成最小值;

3.出隊:首先要判斷佇列是否為空,再進行出隊操作,出隊也需要考慮索引迴圈的問題;

4.判空: 隊頭 == 隊尾;

5.判滿: 隊尾 + 1 == 隊頭。

typedef

struct

mycircularqueue;

//採用陣列實現

//函式宣告

bool mycircularqueueisempty

(mycircularqueue* obj)

;bool mycircularqueueisfull

(mycircularqueue* obj)

;//建立乙個可以存放k個元素的迴圈佇列

mycircularqueue*

mycircularqueuecreate

(int k)

mycircularqueue* obj =

(mycircularqueue*

)malloc

(sizeof

(mycircularqueue));

if(obj ==

null

) obj->data =

(int*)

malloc

(k *

sizeof

(int))

;if(obj->data ==

null

)//賦各項初值

obj->front = obj->rear =0;

obj->size = k;

obj->flag =0;

return obj;

}//向迴圈佇列插入乙個元素,如果成功插入則返回真

bool mycircularqueueenqueue

(mycircularqueue* obj,

int value)

obj->data[obj->rear]

= value;

//插入資料

obj->rear =

((obj->rear +1)

< obj->size)

?(obj->rear +1)

:0;//判斷是否到達陣列邊界,且尾指標+1

if(obj->rear == obj->front)

return true;

}//從迴圈佇列中刪除乙個元素,如果成功插入則返回真

bool mycircularqueuedequeue

(mycircularqueue* obj)

obj->data[obj->front]=0

;//清除隊頭的資料

obj->front =

((obj->front +1)

< obj->size)

?(obj->front +1)

:0;//判斷是否到達陣列邊界,且頭指標+1

obj->flag =0;

//只要刪除了元素,佇列就不可能滿

return true;

}//從隊首獲取元素

intmycircularqueuefront

(mycircularqueue* obj)

return obj->data[obj->front];}

//獲取隊尾元素

intmycircularqueuerear

(mycircularqueue* obj)

int i =

(obj->rear ==0)

?(obj->size -1)

:(obj->rear -1)

;//尾指標指向的是末尾資料的下乙個位置,此處避免陣列越界

return obj->data[i];}

//檢查迴圈佇列是否為空

bool mycircularqueueisempty

(mycircularqueue* obj)

else

}//檢查迴圈佇列是否已滿

bool mycircularqueueisfull

(mycircularqueue* obj)

else

}void

mycircularqueuefree

(mycircularqueue* obj)

資料結構 棧和佇列

棧 基礎 知識棧 練習題 佇列 基礎知識 棧示意圖 後進先出 順序棧結構定義 define maxsize 1024 struct stack 操作函式 push 入棧 pop 出棧 struct lstack 鏈棧示意圖 操作函式 push 入棧 pop 出棧 注意 也可以直接呼叫系統已經寫好的庫...

資料結構 棧和佇列

本章的基本內容是 兩種特殊的線性表 棧和佇列 從資料結構角度看,棧和佇列是操作受限的線性表,他們的邏輯結構相同。從抽象資料型別角度看,棧和佇列是兩種重要的抽象資料型別。p棧 限定僅在表的一端進行插入和刪除操作的線性表。p允許插入和刪除的一端稱為棧頂,另一端稱為棧底。p空棧 不含任何資料元素的棧。a ...

資料結構 棧和佇列

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。class solution int pop node stack2.top stack2.pop return node private stack stack1 stack stack2 大家都知道斐波那契數列,現...