我对栈的学习
2015-09-15 12:31
295 查看
这里我们说的是数据结构中的栈,是一种先进后出的一种数据管理方式,打个比方就是我们把衣服整理好叠进柜子,最先折的衣服都放在最下面,等我们要穿的时候就会拿起最上面的那个衣服穿。
我还是用代码来说明吧,用C语言实现 链表的出栈入栈。代码就是基于我上一篇队列的代码修改的,进过这个修改我更加明白了要想操作好这个数据结构,最重要的是理解,我们是对地址进行操作。
1.结构体定义
2.创建链表和栈
入栈主要是移动top这个指针,跟队列的rear指针一样
4.出栈
出栈也是移动top这个指针,首先我们是遍历到top,然后再把top前面的一个结点赋值给top,最后free 掉原来的top即可
5.获得栈的长度
主函数
我还是用代码来说明吧,用C语言实现 链表的出栈入栈。代码就是基于我上一篇队列的代码修改的,进过这个修改我更加明白了要想操作好这个数据结构,最重要的是理解,我们是对地址进行操作。
1.结构体定义
typedef struct link { int data; struct link *next; }node; typedef struct Stack { node *bottom,*top;//这两个结构体指针就跟队列的队首和队尾指针一样,就2个下标,来操作数据 }stack;这里需要注意的是bottom是栈底,top是栈顶,数据都是先放栈底,出去是栈顶的数据出去。
2.创建链表和栈
stack *creat_stack() { stack *q=(stack *)malloc(sizeof(stack)); q->bottom=NULL; q->top=NULL; return q; } node * creat_link(int n) { node *new,*pre,*head; int i=0; new=NULL; head=(node *)malloc(sizeof(node)); head->next=NULL; pre=head; for(;i<n;i++) { new=(node*)malloc(sizeof(node)); printf("input the data\n"); scanf("%d",&new->data); pre->next=new; pre=new; } pre->next=NULL; return head; }3.入栈
void insert_link_to_stack(stack*q,node * head) { node *newp; newp=head->next; while(newp) { if(q->bottom==NULL) { q->bottom=q->top=newp; } else { q->top->next=newp; q->top=newp; } newp=newp->next; } }
入栈主要是移动top这个指针,跟队列的rear指针一样
4.出栈
void delete_stack(stack * q) { node *pnode=NULL; if(q->bottom==NULL) { printf("\empty stack"); } else { pnode=q->bottom; if(q->bottom==q->top) { q->bottom=q->top=NULL; } else{ while(pnode->next!=q->top) { pnode=pnode->next; } q->top=pnode; q->top->next=NULL; } } }
出栈也是移动top这个指针,首先我们是遍历到top,然后再把top前面的一个结点赋值给top,最后free 掉原来的top即可
5.获得栈的长度
int getlength(stack *q) { int nlen=0; node *pnode=q->bottom; if(pnode==NULL) { nlen=0; } while(pnode!=NULL) { pnode=pnode->next; nlen++; } return nlen; }6.打印栈的数据
void print_stack(stack * q) { node * pnode=q->bottom; if(pnode==NULL) { printf("empty stack!\n"); return ; } printf("data:"); while(pnode!=NULL) { printf("%d ",pnode->data); pnode=pnode->next; } // printf("%d",pnode->data); }
主函数
void main() { int nlen=0; int i=0; node * head; printf("input the number of the data\n"); scanf("%d",&i); head=creat_link(i); stack *hp=creat_stack(); insert_link_to_stack(hp,head); nlen=getlength(hp); printf("nlen=%d\n",nlen); print_stack(hp); delete_stack(hp); delete_stack(hp); nlen=getlength(hp); printf("\nneln=%d\n",nlen); print_stack(hp); printf("\n"); }代码运行效果如下,可以看出,入栈是4 2 1 出了2次栈后,4还在,说明是先入后出
相关文章推荐
- Qt 学习之路 :进程间通信
- Android技术知识网址集合
- 检查硬盘告警的脚本
- 教练式辅导-GROW模型的分析与运用
- 完美激活Flash builder 4.7
- sql:[dbo].[smt_MES_RptProductDaily] 生产日报表
- ICE
- 个人面试题(oracle数据库开发)(一)
- LBP+DLBP+STLBP+VLBP
- 输入输出之File类
- 降维工具箱
- 2014年度辛星完全解读html部分
- IOS开发-CAlayer-锚点小结
- cocos2dx画扇形
- 红黑树
- 简单的数据库交互展示
- 概率分析和随机算法(2)——算法导论(6)
- ubuntu mysql 安装
- mongo 指令
- html base64 img 图片显示