数据结构——栈的初始化、入栈、出栈

本文详细介绍了使用动态数组实现栈的数据结构,包括初始化、进栈、出栈等操作,并通过C++代码展示了如何处理栈溢出及下溢的情况,确保程序的稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

#include "iostream"
using namespace std;
#define STACK_INIT_SIZE 5  //存储空间初试分配量
#define STACKINCREAMENT 10   //存储空间分配增量

//当分配空间地址有MAXLEN个的时候,
//内存空间范围为[0,MAXLEN-1];
//使得base = 0,top = MAXLEN-1;
//初始化top = base = 0
//因为在Push的操作中,每次完了之后都是使得top++;
//如果top==MAXLEN-1的时候,完成之后就会执行top++,这个时候其实top已经在预分配内存之外了
//所以才有了下一步(top-base>=base),从而实现了动态分配
//a)非空栈 top>=1,栈顶元素=s[top-1]
//b)进出栈说明:
//	进栈:现将数据放入top的位置,然后top++
//	出栈:先top--,然后在取出元素
//c)满栈条件 top == MAXLEN,若此时插入元素则会溢出
//d)空栈条件 top == base ==0 ,若此时删除元素,将会发生下溢



typedef struct {
	int *base;//栈底指针
	int *top;//栈顶指针,栈顶永远处于比数据高的一个位置
	int stacksize;
}SqStack;
void InitStack(SqStack &S);
void Push(SqStack &S,int element);
void Pop(SqStack &S);
void main()
{
	SqStack S;
	InitStack(S);
	for (int i = 0;i<10;i++)
	{
		Push(S,i);

	}
	Pop(S);


}
void InitStack(SqStack &S){
	S.base = (int *)malloc(STACK_INIT_SIZE*sizeof(int));
	if (!S.base)
	{
		exit(0);//分配内存失败,程序退出
	}
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
}
void Push(SqStack &S,int element){
	if (S.top-S.base>=S.stacksize)//判断是否栈溢出
	{
		S.base = (int *)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int));
		if (!S.base)
		{
			
			exit(0);//分配内存失败,程序退出
		}

		S.top = S.base+S.stacksize;
		S.stacksize+=STACKINCREAMENT;
	}
	*S.top++ = element;
}
void Pop(SqStack &S){
	//当栈顶和栈底相同时,若删除原始,将会发生“下溢”
	if (S.top==S.base)
	{
		exit(0);
	}
	int element = *--S.top;
	cout<<element<<endl;


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值