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

来源:互联网 发布:奥数 高斯算法 教师版 编辑:程序博客网 时间: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
原创粉丝点击