資料結構 棧和佇列

2021-09-25 13:47:45 字數 3853 閱讀 2754

1、棧的概念及結構

2、入棧出棧示意圖(遵循先進後出原則)

3、棧的實現

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

標頭檔案.h

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

typedef struct stack

stack;

//支援動態增長的棧

typedef struct stack

stack;

// 初始化棧

void stackinit(stack* ps);

// 入棧

void stackpush(stack* ps, int data);

// 出棧

void stackpop(stack* ps);

// 獲取棧頂元素

int stacktop(stack* ps);

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

int stacksize(stack* ps);

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

int stackempty(stack* ps);

// 銷毀棧

void stackdestroy(stack* ps);

.c

// 初始化棧 

void stackinit(stack* ps)

// 入棧

void stackpush(stack* ps, int data)

// 出棧

void stackpop(stack* ps)

// 獲取棧頂元素

int stacktop(stack* ps)

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

int stacksize(stack* ps)

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

int stackempty(stack* ps)

// 銷毀棧

void stackdestroy(stack* ps)

ps->_capacity = 0;

ps->_top = 0;

free(ps->_array);

ps->_array = null;

ps = null;

}

1、佇列的概念及結構2、佇列先進先出示意圖:

3、迴圈佇列

(1)迴圈佇列的優點

相對於直線佇列來講的,直線佇列在元素出隊後,頭指標向後移動,導致刪除元素後的空間無法在利用,即使元素個數小於空間大小,依然無法再進行插入,即所謂的「假上溢」。當變成迴圈佇列之後,刪除元素後的空間仍然可以利用,最大限度的利用空間。

(2)判斷迴圈佇列空和滿有三種方法:

4、佇列的實現

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

標頭檔案.h

// 鏈式結構:表示佇列 

typedef struct qlistnode

qnode;

// 佇列的結構

typedef struct queue

queue;

// 初始化佇列

void queueinit(queue* q);

// 隊尾入佇列

void queuepush(queue* q, int data);

// 隊頭出佇列

void queuepop(queue* q);

// 獲取佇列頭部元素

int queuefront(queue* q);

// 獲取佇列隊尾元素

int queueback(queue* q);

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

int queuesize(queue* q);

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

int queueempty(queue* q);

// 銷毀佇列

void queuedestroy(queue* q);

.c

// 初始化佇列 

void queueinit(queue* q)

// 隊尾入佇列

void queuepush(queue* q, int data)

else

q->_rear = node;

}// 隊頭出佇列

void queuepop(queue* q)

//乙個元素

if (null == q->_front->_pnext)

//多個元素

else

free(q->_front->_pnext);

q->_front->_pnext = null;

}// 獲取佇列頭部元素

int queuefront(queue* q)

// 獲取佇列隊尾元素

int queueback(queue* q)

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

int queuesize(queue* q)

return count;

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

int queueempty(queue* q)

// 銷毀佇列

void queuedestroy(queue* q)

}

(stack)和佇列(queue)是兩種操作受限的線性表。線性表:線性表是一種線性結構,它是乙個含有n≥0個結點的有限序列,同乙個線性表中的資料元素資料型別相同並且滿足「一對一」的邏輯關係。「一對一」的邏輯關係指的是對於其中的結點,有且僅有乙個開始結點沒有前驅但有乙個後繼結點,有且僅有乙個終端結點沒有後繼但有乙個前驅結點,其它的結點都有且僅有乙個前驅和乙個後繼結點。)

這種受限表現在:棧的插入和刪除操作只允許在表的尾端進行(在棧中成為「棧頂」),滿足「fifo:first in last out」;佇列只允許在表尾插入資料元素,在表頭刪除資料元素,滿足「first in first out」。

資料結構 棧和佇列

棧 基礎 知識棧 練習題 佇列 基礎知識 棧示意圖 後進先出 順序棧結構定義 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 大家都知道斐波那契數列,現...