zoukankan      html  css  js  c++  java
  • 两栈共享存储空间

    数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始端,即下标为0处,另一个栈为栈的末端,即下标为数组长度

    n-1处。这样,如果两个栈增加元素,就是两端点向中间延伸。当top1 + 1 == top2 的时候为栈满。

    示例代码:(改编自《大话数据结构》)

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
     
    #include <iostream>
    using namespace std;

    #define  MAXSIZE 20

    typedef int ElemType;
    typedef struct
    {
        ElemType data[MAXSIZE];
        int top1; //栈1栈顶指针
        int top2; //栈2栈顶指针
    } SqStack;

    /* 构造一个空栈*/
    bool InitStack(SqStack *Sq)
    {
        cout << "Init Stack ..." << endl;
        Sq->top1 = -1; //表示空栈
        Sq->top2 = MAXSIZE;

        return true;
    }
    /* 置为空栈 */
    bool ClearStack(SqStack *Sq)
    {
        cout << "Clear Stack ..." << endl;
        Sq->top1 = -1;
        Sq->top2 = MAXSIZE;
        return true;
    }

    bool StackEmpty(SqStack Sq)
    {
        if (Sq.top1 == -1 && Sq.top2 == MAXSIZE)
            return true;
        else
            return false;
    }

    int StackLength(SqStack Sq)
    {
        cout << "Stack Length : ";
        return Sq.top1 + 1 + MAXSIZE - Sq.top2;
    }
    /* 返回栈顶元素 */
    bool GetTop(SqStack Sq, ElemType *ptr, int StackNum)
    {
        if (StackNum == 1)
        {
            if (Sq.top1 != -1)
            {
                *ptr = Sq.data[Sq.top1];
                cout << "Get Top1 Item " << *ptr << endl;
                return true;
            }
            return false;
        }

        else if (StackNum == 2)
        {
            if (Sq.top2 != MAXSIZE)
            {
                *ptr = Sq.data[Sq.top2];
                cout << "Get Top2 Item " << *ptr << endl;
                return true;
            }
            return false;
        }
        else
        {
            cout << "Stack Num must be 1 or 2!" << endl;
            return false;
        }
    }

    /* 压栈 */
    bool Push(SqStack *Sq, ElemType Elem, int StackNum)
    {
        if (StackNum == 1)
        {
            cout << "Push Item to Stack1 : " << Elem << endl;
            if (Sq->top1 + 1 == Sq->top2)   //栈满
                return false;
            Sq->data[++Sq->top1] = Elem;
            return true;
        }
        else if (StackNum == 2)
        {
            cout << "Push Item to Stack2 : " << Elem << endl;
            if (Sq->top1 + 1 == Sq->top2)
                return false;
            Sq->data[--Sq->top2] = Elem;
            return true;
        }
        else
        {
            cout << "Stack Num must be 1 or 2!" << endl;
            return false;
        }
    }
    /* 出栈 */
    bool Pop(SqStack *Sq, ElemType *ptr, int StackNum)
    {
        if (StackNum == 1)
        {
            if (Sq->top1 == -1)
                return false;

            *ptr = Sq->data[Sq->top1--];
            cout << "Pop Item from Stack1 :  " << *ptr << endl;
            return true;
        }
        else if (StackNum == 2)
        {
            if (Sq->top2 == MAXSIZE)
                return false;
            *ptr = Sq->data[Sq->top2++];
            cout << "Pop Item from Stack2 :  " << *ptr << endl;
            return true;
        }
        else
        {
            cout << "Stack Num must be 1 or 2!" << endl;
            return false;
        }

    }

    bool StackTraverse(SqStack Sq)
    {
        cout << "Traverse Stack ..." << endl;
        if (StackEmpty(Sq))
            return false;
        cout << "Stack1 : ";
        for (int i = 0; i <= Sq.top1; i++)
            cout << Sq.data[i] << ' ';
        cout << endl;
        cout << "Stack2 : ";
        for (int i = MAXSIZE - 1; i >= Sq.top2; i--)
            cout << Sq.data[i] << ' ';
        cout << endl;

        return true;
    }

    int main(void)
    {
        SqStack Sq;
        InitStack(&Sq);
        for (int i = 0; i < 5; i++)
            Push(&Sq, i, 1);
        for (int i = 5; i < 10; i++)
            Push(&Sq, i, 2);
        StackTraverse(Sq);
        int result;
        Pop(&Sq, &result, 1);
        Pop(&Sq, &result, 2);
        StackTraverse(Sq);
        GetTop(Sq, &result, 1);
        GetTop(Sq, &result, 2);
        if (!StackEmpty(Sq))
            cout << StackLength(Sq) << endl;

        ClearStack(&Sq);

        return 0;
    }

    输出为:


    事实上 ,使用这样的数据结构,通常都是当两个栈的空间需求有想法关系时,也就是当一个栈增长时另一个栈在缩短的情况。

    还需要注意的一点是必须是同种数据类型的栈,否则不但不能更好地解决问题,反而会使问题更加复杂。

  • 相关阅读:
    myBatis之事务管理
    关于Spring事务回滚的问题
    mysql中的多行查询结果合并成一个
    mybatis传递参数到mapping.xml
    EasyUI 中 DataGrid 控件 列 如何绑定对象中的属性
    写给java开发的运维笔记
    SpringMVC学习系列(11) 之 表单标签
    eclipse 安装svn插件
    linux(centos)搭建SVN服务器
    JavaServer Faces 2.0 can not be installed解决方案
  • 原文地址:https://www.cnblogs.com/alantu2018/p/8471557.html
Copyright © 2011-2022 走看看