说明:
本栈是链式实现的栈,即使用了单链表的形式实现链栈;
这里采用了代码复用的方法,即使用了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
![](http://i.imgur.com/4Yf9ndD.png=400x400)
2.LinkStack_Destroy
![](http://i.imgur.com/EFwxIO9.png=400x400)
3.LinkStack_Clear
![](http://i.imgur.com/91xB7Z5.png=400x400)
4.LinkStack_Push
![](http://i.imgur.com/qOlwJLG.png=400x400)
5.LinkStack_Pop
![](http://i.imgur.com/UsfSn0v.png=400x400)
6.LinkStack_Top
![](http://i.imgur.com/21NQ02i.png=400x400)
7.LinkStack_Size
![](http://i.imgur.com/yEJ7nlT.png=400x400)
汇编分析:
1.DLinkList_Create
![](http://i.imgur.com/YXqzRkN.png=400x400)
2.LinkStack_Push
![](http://i.imgur.com/KRpgsnB.png=400x400)
3.LinkStack_Pop
![](http://i.imgur.com/njzzCpB.png=400x400)