栈ADT

红心栈的链表实现(缺点:对malloc和free的调用的开销昂贵)

灯泡栈ADT链表实现的类型声明

#ifndef _Stack_h

struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;

int         IsEmpty( Stack S );
Stack       CreateStack( void );
void        DisposeStack( Stack S );
void        MakeEmpty( Stack S );
void        Push( ElementTyep X, Stack S );
ElementType Top( Stack S );
void        Pop( Stack S );

#endif    /* _Stack_h */


/* Place in implementation file */
/* Stack implementation is a linked list with a header */
struct Node
{
    ElementType    Element;
    PtrToNode      Next;
};

灯泡测试栈是否为空栈

int
IsEmpty( Stack S )
{
    return S->Next == NULL;
}

灯泡创建一个空栈

Stack
CreateStack( void )
{
    Stack S;

    S = malloc( sizeof( struct Node ) );
    if( S == NULL )
    {
        FatalError( "Out of space!
" );
    }
    S->Next = NULL;
    MakeEmpty( S );
    return S;
}

void 
MakeEmpty( Stack S )
{
    if( S == NULL )
        Error( "Must use CreateStack first" );
    else
        while( !IsEmpty( S ) )
            Pop( S );
}

灯泡Push进栈

void
Push( ElementType X, Stack S )
{
    PtrToNode    TmpCell;
    
    TmpCell = malloc( sizeof( struct Node ) );
    if( TmpCell == NULL )
        FatalError( "Out of sapce !" );
    else
    {
        TmpCell->Element = X;
        TmpCell->Next = S->Next;
        S->Next = TmpCell;
    }
}
灯泡返回栈顶元素
ElementType
Top( Stack S )
{
    if( !IsEmpty( S ) )
        return S->Next->Element;
    Error( "Empty stack" );
    return 0;    /* Return value used to avoid warning */
}

灯泡Pop出栈

void
Pop( Stack S )
{
    PtrToNode    FirstCell;
    
    if( IsEmpty( S ) )
        Error( "Empty stack" );
    else
    {
        FirstCell = S->Next;
        S->Next = S->Next->Next;
        free( FirstCell );
    }
}

 

红心栈的数组实现(避免使用指针并且可能是更流行的解决方案,这种策略的唯一潜在问题是我们需要提前声明一个数组的大小。不过,一般来说,这并不是一个问题,因为在典型的应用程序中,即使有相当多的栈操作,在任一时刻栈元素的实际个数从不会太大。声明一个数组足够大而不至于浪费太多的空间通常并没有什么困难。如果不能做到这一点,那么节省的做法是使用链表来实现。)

灯泡栈的数组实现的类型声明

#ifndef _Stack_h

struct StackRecord
typedef struct StackRecord *Stack;

int            IsEmpty( Stack S );
int            IsFull( Stack S );
Stack          CreateStack( int MaxElements );
void           DisposeStack( Stack S );
void           MakeEmpty( Stack S );
void           Push( ElementType X, Stack S );
ElementType    Top( Stack S );
void           Pop( Stack S );
ElementType    TopAndPop( Stack S );

#endif    /* _Stack_h */


/* place in implementation file */
/* Stack implementaion is a dynamically allocated array */
#define    EmptyTOS        ( -1 )
#define    MinStackSize    (  5 )

struct StackRecord
{
    int             Capacity;
    int             TopOfStack;
    ElementType    *Array;
};

灯泡栈的创建

Stack
CreateStack( int MaxElements )
{
    Stack S;

    if( MaxElements < MinStackSize )
        Error( "Stack size is too small" );
    S = malloc( sizeof( struct StackRecord ) );
    if( S == NULL )
        FatalError( "Out of space !" );

    S->Array = malloc( sizeof( ElementType ) * MaxElements );
    if( S->Array == NULL )
        FatalError( "Out of space !" );
    S->Capacity = MaxElements;
    MakeEmpty( S );

    return S;
}

灯泡释放栈

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

灯泡检测一个栈是否为空

int
IsEmpty( Stack S )
{
    return S->TopOfStack == EmptyTOS;
}

灯泡创建一个空栈

void
MakeEmpty( Stack S )
{
    S->TopOfStack == EmptyTOS;
}

灯泡进栈

void
Push( ElementType X, Stack S )
{
    if( IsFull( S ) )
        Error( "Full Stack" );
    else
        S->Array[ ++S->TopOfStack ] = X;
}

灯泡返回栈顶元素

ElementType
Top( Stack S )
{
    if( !IsEmpty( S ) )
        return S->Array[ S->TopOfStack ];
    Error( "Empty stack" );
    return 0;    /* return value used to avoid warning */
}

灯泡从栈弹出元素

void
Pop( Stack S )
{
    if( IsEmpty( S ) )
        Error( "Empty stack" );
    esle
        S->TopOfStack--;
}

灯泡返回栈顶元素并将其从栈弹出

ElementType
TopAndPop( Stack S )
{
    if( !IsEmpty( S ) )
        return S->Array[ S->TopOfStack-- ];
    Error( "Empty satck" );
    return 0;    /* return value used to avoid warning */
}
原文地址:https://www.cnblogs.com/nufangrensheng/p/3608736.html