两栈共享存储空间

数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始端,即下标为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;
}

输出为:


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

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

原文地址:https://www.cnblogs.com/alantu2018/p/8471557.html