数据结构之共享栈

数据结构之共享栈

线性表的定义

线性表是具有相同数据类型的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;
}

posted on 2025-10-15 21:47  jie_code  阅读(22)  评论(1)    收藏  举报

导航