C語言實現數據結構-----棧

棧是一種先進後出(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]);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章