數據結構——棧ADT1(鏈表實現)

前言:又到了更新博客的時間了,實際上我上週又沒有多少筆記存貨,但是數據結構的學習是當前的重點,一直拖延不是好的習慣,沒有條件,那就強行“創造”條件吧。本篇博客主要內容來自《數據結構與算法分析》C語言描述,下週一定要整點“乾貨”了;下面開始:

一、棧模型及其基本概念

  • (stack):是限定僅在表尾進行插入或刪除的線性表;表尾端有其特殊的含義,被稱爲棧頂,相應的,表頭就被稱爲棧頂;對棧的基本操作有Push(進棧)和Pop(出棧),前者相當於插入,後者相當於刪除,都是在棧頂進行的。
  • 棧有時又被叫做LIFO(last in first out)表,即後進先出線性表;一般棧的模型是:存在某個元素位於棧頂,而該元素是唯一的可見元素;
  • 我個人的理解是:把棧模型看成彈夾模型,進棧是把子彈元素壓入,出棧是把子彈元素彈出,都在頂部操作,遵循後壓入的子彈可以先拿出來的原則。

二、棧的鏈表實現
1、聲明部分

/* 棧的鏈表實現聲明 */
#ifndef _Stack_h
#define _Stack_h



 typedef struct Node
{
	ElemType Elem;
	PtrToNode Next;
	}Node;
	
typedef struct Node *PtrToNode;  //自定義指向Node的數據類型PtrToNode
typedef PtrToNode Stack;   //等價於typedef struct Node *Stack,仔細品

	

int IsEmpty(Stack S);
Stack CreateStack(void);
void MakeEmpty( Stack S);
void Push(ElemType X,Stack S);
ElemType Top(Stack S);
void Pop(Stack S);



#endif


2、測試棧是否爲空(IsEmpty)

int
IsEmpty(Stack S)
{
	return S->Next == NULL;與測試空表的方式相同
}

3、創建一個棧(CreateStack)

  • 創建一個頭結點,MakeEmpty設置Next指針指向NULL;
/* 創建一個空表 */
Stack
CreateStack(void)
{
	Stack S;
	S = malloc(sizeof( Node));
	if(s == NULL)
	printf("Out of space");
	S->Next == NULL;
	MakeEmpty(S);
	return S;
}
void
MakeEmpty(Stack S)
{
	if(S ==NULL)
	printf("Must use CreateStack first");
	else
		while(!IsEmpty(S))
		Pop(S);
	}

4、進棧(Push)

  • Push是通過向鏈表前端進行插入而實現的,表的前端作爲棧頂;
/* 進棧操作實現 */
void
Push(ElemType X,Stack S)
{
	PtrToNode TmpCell;

	TmpCell = malloc(sizeof(Node));
	if(TmpCell ==NULL)
	printf("Out of space");
	else
	{
		TmpCell->Elem = X;
		TmpCell->Next = S->Next;
		S->Next = TmpCell;
	}
}

5、出棧Pop

  • Pop是通過刪除表前端元素而實現的,表的前端作爲棧頂;
/* 出棧操作實現 */
void 
Pop(Stack S)
{
	PtrToNode FirstCell;

	if(IsEmpty(S))
	printf("Empty stack");
	else
	{
		FirstCell = S->Next;
		S->Next = S->Nest->Next;
		free(FirstCell);
	}
}

5、檢查表第一位的元素(Top)

/* 檢查表第一位的元素 */
ElemType
Top(Stack S)
{
	if(!IsEmpty(S))
		return S->Next->Elem;
	else
	{
		printf("Empty stack");
		return 0;
	}
}
		

這裏要注意:爲什麼Stack的前面不用加*呢?

typedef struct Node *PtrToNode;  //自定義指向Node的數據類型PtrToNode
typedef PtrToNode Stack;   //等價於typedef struct Node *Stack,仔細品

這兩段代碼要理解清楚,這裏是*PtrToNode通過自定義數據類型用Stack表示了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章