1. 程式人生 > >用連結串列建立棧 以及用陣列建立棧的區別

用連結串列建立棧 以及用陣列建立棧的區別

#include<stdio.h>
#include<stdlib.h>
typedef struct listnode
{
	int data;
	struct listnode * next;
}node,*Pnode;
typedef struct stack
{
	struct listnode *top;
	struct listnode *base;                   //建立連結串列的指標
}STACK,*pstack;

void init(pstack s)                             //初始化
{
	s->top=(Pnode)malloc(sizeof(node));            //使頭指標指向動態分配的空間
	if(NULL==s->top)
	{
		printf("動態記憶體分配失敗");
		exit(-1);
	}
	else
	{
		s->base=s->top;
		s->top->next=NULL;               //要把s->next=NULL 使其初始化
	}
}
void push(pstack s,int num)                        //入棧
{
	Pnode pnew;
	pnew=(Pnode)malloc(sizeof(node));        //建立新的動態空間
    pnew->data=num;                              
    pnew->next=s->top;                        //使新的指標指向頭指標
	s->top=pnew;                            //頭指標指向新的空間
	
}
bool empty(pstack s)
{
	if(s->top==s->base)
		return true;
	else 
		return false;
}
bool pop(pstack s,int *num)            //出棧,num存出棧的值
{
	
	if(empty(s))
		return false;
	else 
	{
		Pnode pnew=s->top;
		*num=pnew->data;
		s->top=pnew->next;           //建立新的指標,在釋放新指標所指向的空間
		free(pnew);
		pnew=NULL;                 //新指標置為空
		return true;
	}		
}
void traverse(pstack s)                    //遍歷
{
	int num;
	Pnode p=s->top;
	while(p!=s->base)                    //建立新指標,不改變頭指標的位置 ,因為要遍歷而不是出棧
	{
		num=p->data;
		printf("%d\t",num);
		p=p->next;
	}
	putchar('\n');
}
void clear(pstack s)                      //清空棧
{
	if(empty(s))
		return;		
	else
	{
		Pnode p=s->top;
		Pnode q=NULL;                     //建立兩個新指標,這個地方重要 ,要想明白
		while(p!=s->base)
			q=p->next;
		free(p);
		p=q;
	}
	s->top=s->base;                       //最後要保證s->top指向s->base
}
int  main() 
{
	int n,val,num,i;
	
	STACK k;                             //定義棧的變數,因為是區域性變數,所以要傳地址
	init(&k);                                        
	scanf("%d",&n);
	for(i=1;i<=n;i++)                          
	{
		scanf("%d",&num);
		push(&k,num);
	}
	traverse(&k);
	if(pop(&k,&val))
		printf("出棧成功,值為%d:\n",num);
	else 
		printf("出棧失敗\n");
		traverse(&k);
	clear(&k);
	return 0;
}


1.注意棧的銷燬和棧的清空是不一樣的,棧的銷燬時把s->base free 掉,找不到整體,而棧的清空是還能在往上出棧入棧等各種操作;

2.陣列建立棧,是s.top指向沒有存值得空間,s.base指向存值的。而連結串列建立棧則相反  s->base指向沒有存值的,s->top指向存值的;

3.建立指標時,要注意把指標置為NULL,否則會成為野指標;

4.陣列建立的棧在另一個部落格中;