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

说明:

  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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值