数据结构再学习--栈的链表实现

本文介绍了栈的基本概念及其实现方法,包括使用链表实现的栈和数组实现的普通栈,并详细探讨了如何通过一个数组实现两个共享栈,以节省内存空间。

栈是一种很基本的数据结构,就是一个线性表和栈索引值,因为线性表可以用数组和链表实现,这里的是用链式线性表实现了一个操作。在某些特殊的情况下很可能需要把两个栈合成一个栈,两个指针从两端向中间靠拢。所有完整代码:https://github.com/xiaobai1993/XBDataStructNote


#include "XBLinkStack.h"

void initLinkStack(XBLinkStack * statck)
{
    if (statck==NULL) {
        return;
    }
    statck->top = -1;
    
    initXBLinkNode(&(statck->linkStackP));//初始化这个链表
}

int isLinkStackEmpty(XBLinkStack * statck)
{
    return statck->top==-1;
}
void pushLinkStack(XBLinkStack * stack,DATATYPE data)
{

    stack->top+=1;
    addItemToXBLinkNode(&(stack->linkStackP), data);
}
void popLinkStack(XBLinkStack *stack,DATATYPE * data)
{
    
    if (!isLinkStackEmpty(stack)) {
        getItemFromXBLinkNodeByIndex(stack->linkStackP, stack->top, data);
        stack->top--;
    }
}

下面是普通的栈和共享栈


typedef struct
{
    DATATYPE data[MAX_SIZE];
    int top;//栈顶的指针
    
}XBStack;

typedef struct
{
    
    DATATYPE data[MAX_SIZE];
    int top1;
    int top2;
    
}XBShareStack;
void initStack(XBStack * statck)
{
    statck->top = -1;
}

int isEmpty(XBStack * statck)
{
    return statck->top==-1;
}
int isFull(XBStack * stack)
{
    return stack->top==MAX_SIZE-1;
}
void push(XBStack * stack,DATATYPE data)
{
    if (!isFull(stack)) {
        stack->top+=1;
        stack->data[stack->top]= data;
    }
}
void pop(XBStack *stack,DATATYPE * data)
{
    
    if (!isEmpty(stack)) {
        *data = stack->data[stack->top];
        stack->top--;
        
    }
}
//-------共享栈

//共享栈是两个栈,简化就是用了两个top标记和一个数组,一个初始值为0,另一个为数组的MAX_SIZE-1



//**********通常用于解决两个栈的空间有相反需求的关系,而且数据类型是相同的类型




//压入共享栈
int PushShareStatck(XBShareStack *stack,DATATYPE data,int stackNumber)
{
    if (stack->top1+1==stack->top2) {//满了
        return FAIL;
    }
    if (stackNumber==1) {//表示栈1元素入栈
        
        stack->data[++stack->top1] = data;
    }
    else if(stackNumber==2)
    {
        stack->data[--stack->top2]=data;
    }
    return SUCCESS;
}
int PopShareStack(XBShareStack *stack,DATATYPE * obj,int stackNumber)
{
    if (stackNumber==1) {
        
        if (stack->top1==-1) {
            
            return FAIL;
        }
        *obj=stack->data[stack->top1--];
        return SUCCESS;
    }
    else if(stackNumber==2)
    {
        if (stack->top2==MAX_SIZE) {
            return FAIL;
        }
        *obj = stack->data[stack->top2++];
    }
    return SUCCESS;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值