• 数据结构与算法分析 3.21 — 一个数组实现两个栈


    问题仅仅使用一个数组实现两个栈的例程;除非数组每个单元都被使用,否则不能出现溢出声明。

    思路

              假设存在两个栈P与Q,栈P以数组首地址为栈头,其从数组头向数组尾部增长;

              栈Q以数组尾部为栈尾,其从数组尾部向头部增长。

    代码

    struct Node;
    typedef Node *ComStack;
    struct Node
    {
        int capacity;
        int topL;
        int topR;
        ElementType *array;
    };
    
    ComStack CreatComStack(int maxElements);
    int IsEmpty_L(ComStack S);
    int IsEmpty_R(ComStack S);
    int IsFull(ComStack S);
    void MakeEmpty(ComStack S);
    void Push_L(ElementType X, ComStack S);
    void Push_R(ElementType X, ComStack S);
    ElementType Pop_L(ComStack S);
    ElementType Pop_R(ComStack S);
    void DisposeComStack(ComStack S);
    
    ComStack CreatComStack(int maxElements)
    {
        ComStack S;
    
        S = (ComStack)malloc(sizeof(struct Node));
        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_L(ComStack S)
    {
        if (S->topL == -1)
            return true;
        else
            return false;
    }
    
    int IsEmpty_R(ComStack S)
    {
        if (S->topR == S->capacity)
            return true;
        else
            return false;
    }
    
    int IsFull(ComStack S)
    {
        if (S->topL + 1 == S->topR)
            return true;
        else
            return false;
    }
    
    void MakeEmpty(ComStack S)
    {
        /* Capacity在数组界外 */
        S->topL = -1;
        S->topR = S->capacity;
    }
    
    void Push_L(ElementType X, ComStack S)
    {
        if (IsFull(S))
            printf("Stack is full");
        else
        {
            S->topL++;
            S->array[S->topL] = X;
        }
    }
    
    void Push_R(ElementType X, ComStack S)
    {
        if (IsFull(S))
            printf("Stack is full");
        else
        {
            S->topR--;
            S->array[S->topR] = X;
        }
    }
    
    ElementType Pop_L(ComStack S)
    {
        ElementType TmpCell;
    
        if (IsEmpty_L(S))
            printf("Left Stack is empty");
        else
        {
            TmpCell = S->array[S->topL];
            S->topL--;
        }
        return TmpCell;
    }
    
    ElementType Pop_R(ComStack S)
    {
        ElementType TmpCell;
    
        if (IsEmpty_R(S))
            printf("Right stack is empty");
        else
        {
            TmpCell = S->array[S->topR];
            S->topR++;
        }
        return TmpCell;
    }
    
    void DisposeComStack(ComStack S)
    {
        if (S != NULL)
        {
            free(S->array);
            free(S);
        }
    }
  • 相关阅读:
    Hadoop命令解释
    sql的嵌套
    设计模式1 订阅者模式
    我的桌面515
    夜黑我也黑
    测试测试
    竖表转横表(支持多列)
    昨天晚上做了一个梦
    viewpage插件修改版增加 复制媒体文件地址
    PhireeNote 只有自动保存功能的简易记事本
  • 原文地址:https://www.cnblogs.com/tallisHe/p/4214971.html
Copyright © 2020-2023  润新知