六栈的两种实现方式

Posted Alone0710

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了六栈的两种实现方式相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1. 顺序存储的实现

#ifndef _SEQSTACK_H_
#define _SEQSTACK_H_

typedef void SeqStack;

SeqStack* SeqStack_Create(int capacity);

void SeqStack_Destroy(SeqStack* stack);

void SeqStack_Clear(SeqStack* stack);

int SeqStack_Push(SeqStack* stack, void* item);

void* SeqStack_Pop(SeqStack* stack);

void* SeqStack_Top(SeqStack* stack);

int SeqStack_Size(SeqStack* stack);

int SeqStack_Capacity(SeqStack* stack);

#endif


#include "SeqStack.h"
#include "SeqList.h"

SeqStack* SeqStack_Create(int capacity)
{
    return SeqList_Create(capacity);
}

void SeqStack_Destroy(SeqStack* stack)
{
    SeqList_Destroy(stack);
}

void SeqStack_Clear(SeqStack* stack)
{
    SeqList_Clear(stack);
}

int SeqStack_Push(SeqStack* stack, void* item)
{
    return SeqList_Insert(stack, item, SeqList_Length(stack));
}

void* SeqStack_Pop(SeqStack* stack)
{
    return SeqList_Delete(stack, SeqList_Length(stack) - 1);
}

void* SeqStack_Top(SeqStack* stack)
{
    return SeqList_Get(stack, SeqList_Length(stack) - 1);
}

int SeqStack_Size(SeqStack* stack)
{
    return SeqList_Length(stack);
}

int SeqStack_Capacity(SeqStack* stack)
{
    return SeqList_Capacity(stack);
}

#include <stdio.h>
#include <stdlib.h>
#include "SeqStack.h"

int main()
{
    SeqStack* stack = SeqStack_Create(20);
    int a[10];
    int i=0;

    for(i=0;i<10;i++)
    {
        a[i] = i;
        SeqStack_Push(stack,a+i);
    }

    printf("Top:%d\\n",*(int*)SeqStack_Top(stack));
    printf("Capacity:%d\\n",SeqStack_Capacity(stack));
    printf("Length:%d\\n",SeqStack_Size(stack));
    

    SeqStack_Destroy(stack);
    return 0;
}

在这里插入图片描述
注:基于线性表实现
代码复用,很简单的栈实现方式

2. 链式存储的实现

#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
#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);
}

也是基于单链表实现的
很类似,也是很简单

#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"

int main()
{
    LinkStack* stack = LinkStack_Create(20);
    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;
}

在这里插入图片描述

3. 总结

在这一节中,可以看出代码复用的思想很重要,能省下大力气

以上是关于六栈的两种实现方式的主要内容,如果未能解决你的问题,请参考以下文章

栈的两种实现方式(C语言)

栈的两种实现方式(C语言)

栈的两种实现方式(C语言)

Java中栈的两种实现

使用mybatis的两种方式

堆栈的多种实现方式