• 栈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 */
    }
  • 相关阅读:
    Chrome 和 FireFox 查看伪类:active,:hover,:focus样式
    为什么需要清除浮动float,及解决办法
    Chrome 控制台使用之配置网速
    Vue 和 浏览器 之Vue项目在浏览器中运行并使用debug
    CSS里不为人知的秘密(02)之常见属性使用
    ImageMagick 简单使用
    php 使用gmail发送邮件之---gmail授权申请开通
    vue复习知识记录【2】 v-if v-show vfor
    vue复习知识记录【1】 绑定字段、绑定事件、使用方法、使用计算
    解决Selenium下使用Firefox的findElement速度非常慢的问题
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3608736.html
Copyright © 2020-2023  润新知