栈的顺序存储实现(顺序栈)

目录

1、初始化

2、判断栈是否为空

3、入栈

4、出栈

5、读取栈顶

6、top指针初始化为0的情况

7、共享栈


补充一个小知识点:n个不同元素进栈,那么出栈元素不同的排列的个数为 \frac{1}{n+1}C_{2n}^{n} 。

上述公式被称为卡特兰数(Catalan)。

下面是本文思维导图:

1、初始化

先定义顺序栈的主体(这里的元素类型以int型为例):

#define MaxSize 10	//定义栈中元素的最大个数
typedef struct {
	int data[MaxSize];	//静态数组存放栈中元素
	int top;  //栈顶指针
}SqStack;

此时内存中开辟的存储空间如下图所示:

 然后是初始化栈,初始时需要把栈顶指针指向-1

//初始化栈
void InitStack(SqStack& S) {
	S.top = -1;  //初始化栈顶指针
}

2、判断栈是否为空

判断栈是否为空,只需判断top指针是否等于 -1 即可:

//判断栈空
bool StackEmpty(SqStack S) {
	if (S.top == -1) return true;  //栈空
	else return false;	//栈非空
}

3、入栈

先判断栈是否已满,然后注意top指针先自增,再加入元素

//新元素入栈
bool Push(SqStack& S, int x) {
	if (S.top == MaxSize - 1) return false;  //栈满,报错
	S.top = S.top + 1;	//指针先加1
	S.data[S.top] = x;	//新元素入栈
	return true;
}

4、出栈

注意先将元素出栈,再将指针自减。(代码中x前面的“&”表示让x可以把值带出方法外)

bool Pop(SqStack& S, int &x) {
	if (S.top == -1) return false;  //栈空,报错
	x = S.data[S.top];	//栈顶元素先出栈
	S.top = S.top - 1;	//指针再减1
	return true;
}

5、读取栈顶

和出栈操作差不多,唯一不同的就是无需改变top指针的值

bool GetTop(SqStack& S, int& x) {
	if (S.top == -1) return false;  //栈空,报错
	x = S.data[S.top];	//x记录栈顶元素
	return true;
}

6、top指针初始化为0的情况

如果刚开始top指针不初始化为-1而是初始化为0,那么需要调整一下判断栈满还是空的条件,以及入栈时先加入元素,再让top指针加1;出栈的时候先让top指针减1,再将栈顶元素出栈。

7、共享栈

共享栈,即两个栈共享同一片存储空间,它可以在顺序栈的基础上提高内存利用率。

刚开始我们会设置两个栈顶指针,分别代表0号栈和1号栈:

//共享栈的初始化
typedef struct {
	int data[MaxSize];	//静态数组存放栈中元素
	int top0;	//0号栈栈顶指针
	int top1;	//1号栈栈顶指针
}ShStack;

//初始化栈
void InitStack(ShStack& S) {
	S.top0 = -1;  //初始化栈顶指针
	S.top1 = MaxSize;
}

此时内存中的存储空间如下↓

判断共享栈是否栈满:

if(top0 + 1 == top1) printf("栈满");
else printf("栈空");
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值