C語言實現鏈棧的步驟

鏈棧圖解

鏈棧的常規操作

/********************* 鏈棧的常規操作 ****************************/

LinkStack 	 InitLinkStack();			// 初始化鏈棧
int   	 	 StackEmpty();				// 判斷鏈棧空
int   	 	 StackLength();				// 求鏈棧長(鏈棧元素個數)
int    		 Push();					// 入棧 壓棧
ElemType 	 Pop();						// 出棧 彈棧
void 	 	 DestroyStack();			// 銷毀鏈棧

/***************************************************************/

定義鏈棧結構體

#include "stdio.h"
#include "malloc.h"


#define TRUE  1
#define FALSE 0

typedef int ElemType;		// 鏈棧存儲元素的數據類型


/*
 *	定義鏈棧結構體
*/
typedef struct Node{
	ElemType data;			// 棧結點數據域
	struct Node *next;		// 棧結點指針域
}*LinkStack, Node;

初始化鏈棧

// 初始化鏈棧(帶頭結點的鏈棧)
LinkStack InitLinkStack(){
	LinkStack s = (LinkStack)malloc(sizeof(struct Node));
	s -> next = NULL;
	return s;
}

鏈棧判空

/*
 *	判斷鏈棧是否空
 *  s 鏈棧
*/
int StackEmpty(LinkStack s){
	if(s == NULL){
		return FALSE;
	}
	return s -> next == NULL;
}

因為是鏈式存儲結構,無需鏈棧判滿。

計算鏈棧的長度

/*
 *	求鏈棧長度(棧中元素個數)
 *  s 鏈棧
*/
int StackLength(LinkStack s){
	LinkStack p;
	int len = 0;
	if(StackEmpty(s)){
		return FALSE;
	}
	p = s -> next;	// 帶頭結點的鏈棧要先移動一下
	while(p != NULL){
		len ++;
		p = p -> next;
	}
	return len;
}

鏈棧入棧(Push)

/*
 *	入棧 壓棧
 *  s 鏈棧
 *  data 入棧數據
*/
int Push(LinkStack s, ElemType data){
	// 分配入棧結點
	Node *new_node = (Node *)malloc(sizeof(struct Node));
	if (new_node == NULL) return FALSE;		// 結點分配失敗
	
	// 跟單鏈表一樣使用頭插法
	new_node -> data = data;
	new_node -> next = s -> next;
	s -> next = new_node;
	return TRUE;
}

鏈棧出棧(Pop)

/*
 *	出棧 彈棧
 *	s 鏈棧
*/
ElemType Pop(LinkStack s){
	LinkStack top;
	ElemType data;
	// 判棧空
	if(StackEmpty(s)){
		return FALSE;
	}
	top = s -> next;	// 訪問棧頂結點
	data = top -> data;	// 取出棧頂元素
	s -> next = top -> next;
	free(top);			// 釋放棧頂空間
	return data;
}

鏈棧各操作測試

// 程序主入口
int main(int argc, char const *argv[])
{
	LinkStack s = InitLinkStack();
	printf("StackEmpty():%d\n", StackEmpty(s));
	printf("StackLength():%d\n\n", StackLength(s));

	// 入棧元素
	ElemType datas[] = {1, 3, 5, 7, 9};

	// 動態計算入棧元素個數
	int len = sizeof(datas) / sizeof(datas[0]);	

	// for循環依次入棧
	printf("Push():");
	for(int i = 0; i < len; i++){
		printf("%d\t", datas[i]);
		Push(s, datas[i]);
	}
	printf("\nStackEmpty():%d\n", StackEmpty(s));
	printf("StackLength():%d\n\n", StackLength(s));

	// 出棧 彈棧
	printf("Pop(): ");
	while(!StackEmpty(s)){
		printf("%d\t", Pop(s));
	}
	printf("\nStackEmpty():%d\n", StackEmpty(s));
	printf("StackLength():%d\n\n", StackLength(s));
	return 0;
}

結果如下:

StackEmpty():1
StackLength():0

Push():1        3       5       7       9
StackEmpty():0
StackLength():5

Pop(): 9        7       5       3       1
StackEmpty():1
StackLength():0

源代碼

源代碼已上傳到 GitHub Data-Structure-of-C,歡迎大傢來訪。

以上就是C語言實現鏈棧的步驟的詳細內容,更多關於C語言實現鏈棧的資料請關註WalkonNet其它相關文章!

推薦閱讀: