用链表创建栈 以及用数组创建栈的区别
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.数组创建的栈在另一个博客中;
相关文章推荐
- [C/C++]反转链表
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#实现基于链表的内存记事本实例
- C#动态调整数组大小的方法
- 详解Lua中的数组概念知识
- Perl中的列表和数组学习笔记
- 探索PowerShell (八) 数组、哈希表(附:复制粘贴技巧)
- C#中数组初始化与数组元素复制的方法
- C#交错数组用法实例
- PowerShell数组的一些操作技巧
- C#通过yield实现数组全排列的方法
- Ruby简明教程之数组和Hash介绍
- C++基于栈实现铁轨问题
- C语言查找数组里数字重复次数的方法
- C语言柔性数组实例详解
- Perl中怎样从数组中删除某个值?
- C语言栈的表示与实现实例详解
- C语言实现带头结点的链表的创建、查找、插入、删除操作