数据结构封装之《LinkStack链栈》

来源:互联网 发布:java字符串只保留汉字 编辑:程序博客网 时间:2024/04/28 17:48

说明:

  1. 本栈是链式实现的栈,即使用了单链表的形式实现链栈;

  2. 这里采用了代码复用的方法,即使用了LinkList单链表,详见数据结构封装之《LinkList单向链表》;

  3. 栈只能从栈顶Pop出元素,或者获取Top元素而不Pop;

  4. 链栈可以存储任意数量的的数据,同时因为其存入的是数据的首地址,所以能够存储任意类型的数据。

下面将给出该数据结构的代码,每个函数的结构分析 ,以及个别主要函数的汇编分析


代码:

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

原创粉丝点击