数据结构封装之《LinkStack链栈》
来源:互联网 发布:java字符串只保留汉字 编辑:程序博客网 时间:2024/04/28 17:48
说明:
本栈是链式实现的栈,即使用了单链表的形式实现链栈;
这里采用了代码复用的方法,即使用了LinkList单链表,详见数据结构封装之《LinkList单向链表》;
栈只能从栈顶Pop出元素,或者获取Top元素而不Pop;
链栈可以存储任意数量的的数据,同时因为其存入的是数据的首地址,所以能够存储任意类型的数据。
下面将给出该数据结构的代码,每个函数的结构分析 ,以及个别主要函数的汇编分析
代码:
LinkStack.h
#ifndef _LINKSTACK_H_#define _LINKSTACK_H_typedef void LinkStack;LinkStack* LinkStack_Create();void LinkStack_Destroy(LinkStack* stack);void LinkStack_Clear(LinkStack* stack);int LinkStack_Push(LinkStack* stack, void* item);void* LinkStack_Pop(LinkStack* stack);void* LinkStack_Top(LinkStack* stack);int LinkStack_Size(LinkStack* stack);#endif
LinkStack.c
#include <malloc.h>#include "LinkStack.h"#include "LinkList.h" //这里复用了单向链表的代码typedef struct _tag_LinkStackNode{ LinkListNode header; void* item;} TLinkStackNode;//创建链表栈LinkStack* LinkStack_Create(){ return LinkList_Create();}//销毁链表栈void LinkStack_Destroy(LinkStack* stack){ LinkStack_Clear(stack); LinkList_Destroy(stack);}//清空链表栈void LinkStack_Clear(LinkStack* stack){ while( LinkStack_Size(stack) > 0 ) { LinkStack_Pop(stack); }}//压栈int LinkStack_Push(LinkStack* stack, void* item){ TLinkStackNode* node = (TLinkStackNode*)malloc(sizeof(TLinkStackNode)); int ret = (node != NULL) && (item != NULL); if( ret ) { node->item = item; ret = LinkList_Insert(stack, (LinkListNode*)node, 0);//返回是否成功 } if( !ret ) { free(node); } return ret;}//弹栈void* LinkStack_Pop(LinkStack* stack){ TLinkStackNode* node = (TLinkStackNode*)LinkList_Delete(stack, 0);//从链表中删除指定数据元素(并未真正删除,仅从链表中断开),并返回该数据的地址; void* ret = NULL; if( node != NULL ) { ret = node->item; free(node); } return ret;}//获取链表栈顶void* LinkStack_Top(LinkStack* stack){ TLinkStackNode* node = (TLinkStackNode*)LinkList_Get(stack, 0); void* ret = NULL; if( node != NULL ) { ret = node->item; } return ret;}//链表栈的大小int LinkStack_Size(LinkStack* stack){ return LinkList_Length(stack);}
main.c
#include <stdio.h>#include <stdlib.h>#include "LinkStack.h"int main(int argc, char *argv[]) { LinkStack* stack = LinkStack_Create(); int a[10]; int i = 0; for(i=0; i<10; i++) { a[i] = i; LinkStack_Push(stack, a + i); } printf("Top: %d\n", *(int*)LinkStack_Top(stack)); printf("Length: %d\n", LinkStack_Size(stack)); while( LinkStack_Size(stack) > 0 ) { printf("Pop: %d\n", *(int*)LinkStack_Pop(stack)); } LinkStack_Destroy(stack); return 0;}
函数结构分析:
1.LinkStack_Create
2.LinkStack_Destroy
3.LinkStack_Clear
4.LinkStack_Push
5.LinkStack_Pop
6.LinkStack_Top
7.LinkStack_Size
汇编分析:
1.DLinkList_Create
2.LinkStack_Push
3.LinkStack_Pop
阅读全文
0 0
- 数据结构封装之《LinkStack链栈》
- 数据结构封装之《LinkStack链栈》
- 链栈(LinkStack)
- xDM算法封装之数据结构
- LinkStack实现
- 数据结构封装之 《SeqList顺序表》
- 数据结构封装之《LinkList单向链表》
- 数据结构封装之《StaticList静态链表》
- 数据结构封装之《CircleList循环链表》
- 数据结构封装之《DLinkList双向链表》
- 数据结构封装之《SeqList顺序栈》
- 数据结构封装之《LinkQueue链式队列》
- 数据结构封装之《SeqQueue顺序式队列》
- 数据结构封装之《SQueue栈式队列》
- 数据结构封装之《GTree通用树》
- 数据结构封装之 《SeqList顺序表》
- 数据结构封装之《LinkList单向链表》
- 数据结构封装之《StaticList静态链表》
- a foreign key constraint fails (`school`.`score1`, CONSTRAINT `FK_jqig2u3ktbhovid14i12faasf` FOREIGN
- EditText插入图片
- 关于2005-Unknown MySQL server host 'localhost'(0)
- 仿RadioGroup实现底部导航
- Twemproxy 介绍与使用
- 数据结构封装之《LinkStack链栈》
- Mybatis源码解析 —— 动态设置参数机制
- springboot全局异常捕捉
- Android Studio 使用第三方库的方法
- OpenDDS开发手册---第三章(服务质量)1
- log4j使用及详细配置说明
- c++用分治法对随机数组归并排序
- 1384 全排列
- Thinkphp5学习(17)输入和验证