數據結構與算法--鏈棧

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)。對於空間性能,順序棧需要事先確定一個固定長度,可能會存在內存浪費問題,但它優勢是存取時定位很方便,而鏈棧則要求每個元素都有指針域,同時增加了一些內存開銷,但對於棧的長度無限制。因此:

如果棧的使用過程中元素變化不可預料,那麼最好用鏈棧;反之,如果它的變化在可控範圍內,應使用順序棧。


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