数据结构之共享栈
数据结构之共享栈
线性表的定义
线性表是具有相同数据类型的n(n>=0)个数据元素的优先序列,n为表长,当n=0时,线性表是空表。若用L命名线性表,则其一般表示为 L = (a1,a2,a3, ... an);
栈顶指针:栈顶指针并不是C语言中的指针,存储的不是内存地址,它是存储栈顶的数组下标,通过栈顶的下标可以快速定位栈顶元素,
栈和线性表的关系
- 栈是特殊的线性表,栈只允许在线性表的一端进行插入和删除操作。进行插入和删除元素操作的一端称为栈顶。
- 在栈顶插入元素的操作称为入栈,删除操作称为出栈
![image]()
顺序栈
用顺序存储结构实现的栈称为顺序栈Squence Stack
使用静态数组存储数据元素,会导致存储空间固定,栈满了会导致无法存入新的数据,栈的空间大了会导致,内存空间利用率不高,共享栈可以提高内存空间利用率不高的问题
共享栈
- 共享栈:两个栈指向同一片连续数据空间
- 共享栈是使用两个栈顶指针指向同一片连续数据空间,两个栈顶指针分别指向数据空间的两端
![image]()
共享栈的运算(基本操作)
#include<stdio.h>
#define MaxSize 8 // 定义共享栈的最大元素个数
#define ElemType int // 定义元素类型
typedef struct SharedStack {
ElemType data[MaxSize];
size_t top1; // 栈1的栈顶指针
size_t top2; // 栈2的栈顶指针
}SharedStack;
// 初始化栈
void init_shared_stack(SharedStack& s)
{
s.top1 = -1;
s.top2 = MaxSize;
}
// 返回栈是否为空
int shared_stack_isEmpty(SharedStack s)
{
if (s.top1 == -1)
return -1; // 一号栈为空
if (s.top2 == MaxSize)
return -2; // 二号栈为空
}
// 入栈 操作
// flag == 1 给一号栈入栈
// flag == 2 给二号栈入栈
bool push_shared_stack(SharedStack& s, ElemType x,int flag)
{
if (s.top1 + 1 == s.top2)
return false; // 栈满了
if (flag == 1)
{
s.data[++s.top1] = x;
return true;
}
else if (flag == 2)
{
s.data[--s.top2] = x;
return true;
}
else {
printf("error: flag 是一个错误值");
}
}
// 出栈 操作
// flag == 1 给一号栈出栈
// flag == 2 给二号栈出栈
bool pop_shared_stack(SharedStack& s, ElemType& x, int flag)
{
if (flag == 1)
{
if (s.top1 == -1)
return false; // 一号栈为空
x = s.data[s.top1--];
return true;
}
else if (flag == 2)
{
if (s.top2 == MaxSize)
return false; // 二号栈为空
x = s.data[s.top2++];
return true;
}
else {
printf("error: flag 是一个错误值");
}
}
// 获取1号栈,栈顶元素
bool get_stack1(SharedStack s, ElemType& x, int flag)
{
if (flag == 1)
{
if (s.top1 == -1)
return false; // 一号栈为空
x = s.data[s.top1];
return true;
}
else if (flag == 2)
{
if (s.top2 == MaxSize)
return false; // 二号栈为空
x = s.data[s.top2];
return true;
}
else {
printf("error: flag 是一个错误值");
}
}
// 获得栈元素个数
size_t get_shared_stack_length(SharedStack s)
{
size_t len = 0;
len = MaxSize - s.top2 + s.top1 + 1;
return len;
}
void test_shared_stack() // 测试共享栈基本操作函数
{
SharedStack s1;
init_shared_stack(s1);
push_shared_stack(s1, 1, 1);
push_shared_stack(s1, 3, 1);
push_shared_stack(s1, 5, 1);
push_shared_stack(s1, 7, 1);
push_shared_stack(s1, 11, 2);
push_shared_stack(s1, 12, 2);
push_shared_stack(s1, 13, 2);
push_shared_stack(s1, 14, 2);
printf("当前共享栈的元素个数为:%d\n", get_shared_stack_length(s1));
int x;
pop_shared_stack(s1, x, 1);
printf("出栈的值是:%d\n", x);
pop_shared_stack(s1, x, 1);
printf("出栈的值是:%d\n", x);
printf("当前共享栈的元素个数为:%d\n", get_shared_stack_length(s1));
}
int main()
{
test_shared_stack();
return 0;
}


浙公网安备 33010602011771号