前言:又到了更新博客的時間了,實際上我上週又沒有多少筆記存貨,但是數據結構的學習是當前的重點,一直拖延不是好的習慣,沒有條件,那就強行“創造”條件吧。本篇博客主要內容來自《數據結構與算法分析》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表示了