用链表创建栈 以及用数组创建栈的区别

#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.数组创建的栈在另一个博客中;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值