数据结构与算法分析 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 ); } }