LinkedList.h
/* 棧的鏈式存儲結構--鏈棧 */
typedef int LElemType;
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct LinkedStackNode
{
LElemType data;
struct LinkedStackNode *next;
}LinkedStackNode,*LinkedStackPtr;
typedef struct LinkedStack
{
LinkedStackPtr top;
int count;
}LinkedStack;
Status InitStack(LinkedStack *S); //初始化操作,建立一個空棧S
Status DestroyStack(LinkedStack *S); //棧棧存在,則銷燬它
Status ClearStack(LinkedStack *S); //將棧清空
int StackEmpty(LinkedStack S); //若棧爲空,返回true,否則返回false
Status GetTop(LinkedStack S,LElemType *e); //若棧存在且非空,用e返回S的棧頂元素
Status Push(LinkedStack *S,LElemType e); //若棧S存在,將新元素e插入棧S中併成爲棧頂元素
Status Pop(LinkedStack *S,LElemType *e); //刪除棧S中棧頂元素,並用e返回其值
int StackLength(LinkedStack S); //返回棧S的長度
LinkedList.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "LinkedStack.h"
int main(void)
{
LinkedStack S;
InitStack(&S);
printf("已初始化好,現在壓棧1,2,3,4");
Push(&S,1);
Push(&S,2);
Push(&S,3);
Push(&S,4);
printf("\n現在的長度是:%d\n",StackLength(S));
printf("現在依次彈棧:");
LElemType e ;
Pop(&S,&e);
printf("%d,",e);
Pop(&S,&e);
printf("%d,",e);
Pop(&S,&e);
printf("%d,",e);
Pop(&S,&e);
printf("%d,",e);
printf("\n現在的長度是:%d\n",StackLength(S));
return 0;
}
Status InitStack(LinkedStack *S) //初始化操作,建立一個空棧S
{
S->top = NULL;
S->count = 0;
return OK;
}
Status DestroyStack(LinkedStack *S) //棧棧存在,則銷燬它
{
ClearStack(S);
return OK;
}
Status ClearStack(LinkedStack *S) //將棧清空
{
LinkedStackPtr p = S->top;
while(p)
{
LElemType e;
Pop(S,&e);
}
return OK;
}
int StackEmpty(LinkedStack S) //若棧爲空,返回true,否則返回false
{
return S.count == 0;
}
Status GetTop(LinkedStack S,LElemType *e) //若棧存在且非空,用e返回S的棧頂元素
{
if(StackEmpty(S))
{
return ERROR;
}
*e = S.top->data;
return OK;
}
Status Push(LinkedStack *S,LElemType e) //若棧S存在,將新元素e插入棧S中併成爲棧頂元素
{
LinkedStackPtr p = (LinkedStackPtr)malloc(sizeof(LinkedStackNode));
p->data = e;
p->next = S->top;
S->top = p;
S->count ++;
return OK;
}
Status Pop(LinkedStack *S,LElemType *e) //刪除棧S中棧頂元素,並用e返回其值
{
if(StackEmpty(*S))
{
return ERROR;//爲空
}
LinkedStackPtr p = S->top;
*e = p->data;
S->top = p->next;
free(p);
S->count --;
return OK;
}
int StackLength(LinkedStack S) //返回棧S的長度
{
return S.count;
}
對比一下順序棧和鏈棧的時間複雜度都爲O(1)。對於空間性能,順序棧需要事先確定一個固定長度,可能會存在內存浪費問題,但它優勢是存取時定位很方便,而鏈棧則要求每個元素都有指針域,同時增加了一些內存開銷,但對於棧的長度無限制。因此:
如果棧的使用過程中元素變化不可預料,那麼最好用鏈棧;反之,如果它的變化在可控範圍內,應使用順序棧。