目錄
棧(stack)又名堆疊,它是一種運算受限的線性表。限定僅在固定的一端進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。棧中的資料元素遵守後進先出lifo(last in first out)的原則。
壓棧:棧的插入操作叫做進棧/壓棧/入棧,入資料在棧頂。
出棧:棧的刪除操作叫做出棧。出資料也在棧頂
棧的實現一般可以使用陣列或者鍊錶實現,相對而言陣列的結構實現更優一些。因為陣列在尾上插入資料的代價比較小這裡我們用順序表結構來實現棧。
順序表可以把使用的空間寫成固定值,也可以構建動態開闢記憶體;但是如果寫成固定的陣列形式當存的資料滿了就不能再使用了,所以下面我們實現的是動態開闢記憶體的形式。
所以我們先建立乙個順序表結構體型別,結構體型別中有指標,下標,容量。
指標: 用來維護在堆上連續的一段空間,
下標:表示資料存放到哪乙個位置了,因為資料只能乙個接著乙個地存放,要有個下標來記錄我資料放到哪乙個位置了。
容量:與下標相比較,當下標與容量相等就表示空間儲存滿了,要進行擴容處理。
建立型別如下:
typedef int stdatatype; //對int型別重新起個名字叫datatype
//建立乙個棧結構體型別
struct stack
;//對順序表型別struct stack型別重新起個名字叫sl
typedef struct stack st;
//當size 和 capacity相等時要進行擴容處理
//初始化變數st
void stackinit(st* ps)
//棧的銷毀
void stackdestroy(st* ps)
1.入棧
//入棧
void stackpush(st* ps, stdatatype x)
www.cppcns.com
ps->a = tmp;
} //沒有滿就直接在後面入棧
ps->a[ps->top] = x;
ps->top++;
}2.出棧
//出棧,要注意棧不能為空
void stackpop(st* ps)
3.獲取棧頂的資料
//返回棧頂的元素
stdatatype stacktop(st* ps)
4.獲取棧的元素個數
//獲取棧的元素個數
int stacksize(st* ps)
5.判斷棧是否為空
//判斷棧是否為空
bool stackempty(st* ps)
佇列:只允許在一端進行插入資料操作,在另一端進行刪除資料操作的特殊線性表,佇列具有先進先出fifo(first in first out)的性質。
佇列:進行插入操作的一端稱為隊尾
出佇列: 進行刪除操作的一端稱為隊頭
佇列也可以陣列和鍊錶的結構實現,使用鍊錶的結構實現更優一些,因為如果使用陣列的結構,出佇列在陣列頭上出資料,效率會比較低。
而鍊錶我們採用雙向鏈結結構,乙個指標來維護頭節點,乙個指標維護尾部節點
定義的結構體型別如下:
typedef int qdatatype;
//建立乙個結點型結構體
typedef struct queuenode
queuenode;
//建立乙個佇列
typedef struct queue
queue;
//初始化佇列
void queueinit(queue* pq)
//佇列銷毀
void queuedestroy(queue* pq)
pq->head = null;
pq->tail = null;
}1. 入資料
//入資料有兩種情況
void queuepush(queue* pq,qdatatype x)
newnode->next = null;
newnode->data = x;
//1.入佇列時隊列為空狀態
if (pq->head == null)
//入佇列,佇列不為空,直接在尾指標後面鏈結即可
else
}2.出資料
//出資料,類似鍊錶的頭刪
void queuepop(queue* pq)
}3.取隊頭資料
//取隊頭資料
qdatatype queuefront(queue* pq)
4.取隊尾資料
//取隊尾資料
qdatatype queueback(queue* pq)
5.獲取佇列元素個數
//獲取佇列元素個數
int queuesize(queue* pq)
return count;
}6.判斷佇列是否為空
//判斷佇列是否為空
bool queueempty(queue* pq)
以上就是棧和佇列的實現內容了,其中前面我只有把原始檔stack.c 和queue.c拆開來分析了。如果想要棧和佇列的全部內容,闊以移步到gitee上獲取
【棧的原始碼鏈結,點選即可】
【佇列的原始碼鏈結,點選即可】
資料結構 棧和佇列(c語言)
棧和佇列是兩種重要的線性結構。從資料結構角度來看,棧和佇列也是線性表,其特殊性在於棧和佇列的基本操作是線性表操作的子集,他們是操作受限制的線性表,因此,可稱為限定性的資料結構。但從資料型別角度看,它們是和線性表大不相同的兩類重要的抽象資料型別。由於它們廣泛應用在各種軟體系統中,因此在物件導向的程式設...
(C語言)資料結構 佇列 棧
12 佇列 queue 入隊 put 出對get 1 2 file queue linkedlist.c 3 4 佇列 queue 5 入隊 put 放在鍊錶尾部,並更新指向鍊錶尾部的指標tail 6 出隊 get 返回並刪除鍊錶頭部節點,並更新指向鍊錶頭部的指標head 7 8 9 include...
C語言資料結構 棧 佇列
ifndef zydl h define zydl h include head.h define stack int size 100 define stackincrement 10 define duqueue max size 10 define maxqsize 100 typedef i...