数据结构与算法分析 3.23 — 用一个数组实现三个(多个)栈

一、题目

    用一个数组实现三个(或多个)栈

二、解答

    用一个数组实现三个乃至多个栈,如果想使用一个数组构造两个栈的思想则行不通;

    考虑使用静态链表,数组结点中存在两个域,关键字域与指示栈的前驱的游标,则可以使三个栈可以用一个数组表示;

    ADT的关键术语:

    Capacity: 数组的容量;

    Size: 数组已经存储的数据元素个数;

    Top_Fst:First栈的栈顶;

三、代码

struct Node;
typedef struct Node ElementType;
typedef struct StackRecord * Stack;

struct Node
{
    Type Key;
    int Pre;
};

struct StackRecord
{
    int Capacity;
    int Size;
    int Top_Fst;
    int Top_Snd;
    int Top_Trd;
    ElementType *Array;
};

Stack CreateStack( int MaxElements );
int IsEmpty_Fst( Stack S );
int IsFull( Stack S );
void Push_Fst( Type Key, Stack S );
Type Pop_Fst( Stack S );
void MakeEmpty( Stack S );
void DisposeStack( Stack S );

Stack CreateStack( int MaxElements )
{
    Stack S;

    S = (Stack)malloc( sizeof(struct StackRecord) );
    if ( S == NULL )
    {
        printf( "Out of space" );
        return NULL;
    }

    S->Array = (ElementType *)malloc( sizeof(ElementType) * MaxElements );
    if ( S->Array == NULL )
    {
        printf( "Out of space" );
        return NULL;
    }

    S->Capacity = MaxElements;
    MakeEmpty(S);

    return S;
}

int IsEmpty_Fst( Stack S )
{
    return S->Top_Fst == -1;
}

int IsFull( Stack S )
{
    return S->Size == S->Capacity;
}

void MakeEmpty( Stack S )
{
    if ( S != NULL )
    {
        S->Size =0;
        S->Top_Fst = -1;
        S->Top_Snd = -1;
        S->Top_Trd = -1;
    }
}

void Push_Fst( Type Key, Stack S )
{
    int TmpCell;

    if ( IsFull(S) )
        printf( "Stack is full" );
    else
    {
        TmpCell = S->Top_Fst;
        S->Top_Fst = S->Size;
        S->Array[S->Top_Fst].Key = Key;
        S->Array[S->Top_Fst].Pre = TmpCell;
        S->Size++;
    }
}

Type Pop_Fst( Stack S )
{
    int TmpCell;

    if ( IsEmpty_Fst(S) )
        printf( "Stack is empty" );
    else
    {
        TmpCell = S->Top_Fst;
        S->Top_Fst = S->Array[TmpCell].Pre;
        S->Size--;
    }

    return S->Array[TmpCell].Key;
}

void DisposeStack( Stack S )
{
    if ( S != NULL )
    {
        free( S->Array );
        free( S );
    }
}

 

转载于:https://www.cnblogs.com/tallisHe/p/4007461.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值