棧
棧是一種先進後出(LIFO)的數據結構,棧的一個最重要的特徵就是隻能在棧頂進行入棧和出棧操作。今天我們來講一下最簡單的棧的實現,靜態棧的實現,可以把它看作是一個數組,但是這個數組我們只能在它的末尾進行插入和刪除操作,是一種受限制的數據結構。
)
棧的線性存儲
首先我們來定義一個棧的類型
typedef struct Stack{
int *vect; //元素的存儲位置用void *來表示存儲的元素可以是任意類型的
size_t size; //棧的大小
size_t cnt; //棧當前元素個數
}Stack;
接下來我們看一下棧的一些操作方法
初始化一個棧
給定一個棧的地址和大小(存儲元素個數),可以初始化一個棧
void stack_init(Stack *s,size_t size){
s->vect = malloc(sizeof(int)*size);
s->cnt = 0;
s->size = size;
}
銷燬一個棧
void stack_destroy(Stack *s){
free(s->vect);
s->vect = NULL;
}
判斷一個棧是否爲空
只需要判斷裏面是否存在元素即可
bool stack_is_empty(Stack *s){
return s->cnt == 0;
}
判斷一個棧是否已經滿
book stack_is_full(Stack *s){
return s->cnt == s->size;
}
壓棧
void stack_push(Stack *s,int data){
s->vect[s->cnt++] = data; //只需要把數據存放在線性表中,
//並且把裏面的元素個數+1
}
出棧
int stack_pop(Stack *s){
return s->vect[--s->cnt];
}
查看棧頂元素
和出棧不同,查看棧頂元素不需要對立面的元素進行操作,即不需要讓元素個數-1
int top(Stack *s){
return s->vcet[s->cnt-1]
}
遍歷棧
遍歷棧就和遍歷數組一樣的操作,無需多言
void foreach(Stack *s,void(*func)(int)){
size_t i;
for(i=0;i<cnt;i++){
func(s->vect[i]);
}
}