1. 程式人生 > >3.2實現鏈棧的各種基本運算

3.2實現鏈棧的各種基本運算

程式結構:與exp3-1.cpp相同

程式程式碼:

listack.cpp

//鏈棧基本運算演算法
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct linknode
{	
	ElemType data;				//資料域
	struct linknode *next;		//指標域
} LinkStNode;					//鏈棧型別
void InitStack(LinkStNode *&s)
{
	s=(LinkStNode *)malloc(sizeof(LinkStNode));
	s->next=NULL;
}
void DestroyStack(LinkStNode *&s)
{
	LinkStNode *p=s->next;
	while (p!=NULL)
	{	
		free(s);
		s=p;
		p=p->next;
	}
	free(s);	//s指向尾結點,釋放其空間
}
bool StackEmpty(LinkStNode *s)
{
	return(s->next==NULL);
}
bool Push(LinkStNode *&s,ElemType e)
{	LinkStNode *p;
	p=(LinkStNode *)malloc(sizeof(LinkStNode));
	p->data=e;				//新建元素e對應的結點p
	p->next=s->next;		//插入p結點作為開始結點
	s->next=p;
	return true;
}
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;		//刪除p結點
	free(p);				//釋放p結點
	return true;
}
bool GetTop(LinkStNode *s,ElemType &e)
{	if (s->next==NULL)		//棧空的情況
		return false;
	e=s->next->data;
	return true;
}

exp3-2.cpp
#include"listack.cpp"
int main()
{	
	ElemType e;
	LinkStNode *s;
	char ch[5]={'a','b', 'c','d','e'};
	int i=0;
	int length =5;
	printf("\n");
	printf(" (1)初始化棧\n");
	InitStack(s);
	printf(" (2)棧為%s\n",(StackEmpty(s)?"空":"非空"));
	printf(" (3)依次進棧元素a,b,c,d,e\n");
	while(i<length)
	{	Push(s,ch[i]);
		i++;
		}	
		
	printf(" (4)棧為%s\n",(StackEmpty(s)?"空":"非空"));
	printf(" (5)出棧序列:");
	while(!(StackEmpty(s)))
	{
		Pop(s,e);
		printf(" %c ",e);
	}
	printf("\n");
	printf(" (6)棧為%s\n",(StackEmpty(s)?"空":"非空"));
	printf(" (7)銷燬棧\n");
	DestroyStack(s);
	
}


區別: