您的位置:首页 > 其它

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

2015-07-22 23:23 330 查看
#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.数组创建的栈在另一个博客中;

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数组 链表