數據結構模板之五:鏈棧

①基本定義

採用鏈式存儲結構的棧稱爲鏈棧和順序棧相比,鏈棧的優點是不存在棧滿上溢出的情況,有關順序棧的內容可以點此查看。

②存儲方式與結構

棧(a1,a2,...,an-1,an)

映射


③實現

順序棧棧空的條件是s->top==-1,而鏈棧棧空的條件則是s->next=NULL。

#include <iostream>
#include <cstdio>
#define MaxSize 50
typedef int ElemType;

typedef struct linknode
{
	ElemType data;               //數據域
	linknode *next;              //指針域
}LinkStNode;                     //鏈域結點類型  

/*****初始化棧*****/
void InitStack(LinkStNode * &s)
{
	s=(LinkStNode *)malloc(sizeof(LinkStNode));
	s->next==NULL;
}

/*****銷燬棧*****/
void DestroyStack(LinkStNode * &s)
{
	LinkStNode *pre=s,*p=s->next;        //pre指向頭結點,p指向首結點
	while(p!=NULL)                       //循環到p爲空爲止
	{
		free(pre);
		pre=p;                           //pre,p同步後移
		p=pre->next;
	}
	free(pre);                           //此時pre指向尾結點,釋放其空間
}

/*****判斷棧是否爲空棧*****/
bool StackEmpty(LinkStNode *s)
{
	return (s->next==NULL);
}

/*****進棧*****/
void Push(LinkStNode * &s,ElemType e)
{
	LinkStNode *p;
	p=(LinkStNode *)malloc(sizeof(LinkStNode));
	p->data=e;
	p->next=s->next;                               //將p結點插入作爲首結點
	s->next=p;
}

/*****出棧*****/
bool Pop(LinkStNode * &s,ElemType &e)
{
	LinkStNode *p;
	if(s->next==NULL)                              //棧空的情況
		return false;
	p=s->next;                                     //p指向首結點
	e=p->data;                                     //提取首結點值
	s->next=p->next;                               //刪除首結點
	free(p);
	return true;
}

/*****取棧頂元素*****/
bool GetTop(LinkStNode *s,ElemType &e)
{
	if(s->next==NULL)                        //棧空的情況
		return false;
	e=s->next->data;                         //提取首結點值
	return true;
}

int main()
{
	return 0;
}
---代碼和部分內容參考自《數據結構教程》
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章