用链表创建栈 以及用数组创建栈的区别
来源:互联网 发布:奥数 高斯算法 教师版 编辑:程序博客网 时间:2024/06/05 02:55
#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.数组创建的栈在另一个博客中;
0 0
- 用链表创建栈 以及用数组创建栈的区别
- 二叉数组的创建以及后续遍历
- Java数组的创建以及初始化
- 语法糖创建数组的区别
- C++ new 创建对象加不加括号的区别以及用new创建对象的特点
- C++ 对象和实例的区别,以及用new和不用new创建类对象区别
- C++ 对象和实例的区别,以及用new和不用new创建类对象区别
- C++ 对象和实例的区别,以及用new和不用new创建类对象区别
- php中cookie数组创建以及使用,cookie的删除
- js中的数组与对象的创建以及json对象
- 创建一个数组, 实现数组初始化、数组清空以及数组元素的逆置
- 主键与索引的创建的规则以及区别
- 线程Thread的两种创建方式以及区别
- Java 创建字符串String的各种方法以及区别
- 创建线程的两种方式以及区别
- C++与Java数组的申明创建初始化的区别
- j2se 数组的创建
- 数组的创建(matlab)
- NSString写入文件和导出文件
- 源码分析Activity启动的流程
- java中时分秒的取得与转换
- 数值优化(Numerical Optimization)学习系列-共轭梯度方法(Conjugate Gradient)
- C++初始化成员列表,符合类,const修饰函数
- 用链表创建栈 以及用数组创建栈的区别
- Linked List Cycle
- java:ArrayList集合与HashSet集合元素重复性探讨
- 性能测试的一些参考blog
- C++析构函数,This指针,函数链
- 简单五子棋服务器
- 各种极致的树莓派玩法
- CSS清除浮动大全共8种方法
- lucene4之后的近实时搜索实现