数据结构——栈

一、栈的定义

栈(stack)是限定仅在表尾进行插入和删除操作的线性表。将允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为先进后出(Last In First Out)的线性表,简称LIFO结构。

栈的插入叫作进栈,也称压栈、入栈,类似子弹入弹夹;栈的删除叫作出栈,也称弹栈,如同弹夹的子弹出夹。

 二、栈的顺序存储结构——顺序栈

1、结构定义

typedef int SElemType;

typedef struct{
	SElemType data[MAXSIZE];
	int top;
        int stacksize;
}SqStack;

2、进栈

/*插入元素e为新的栈顶元素*/
Status Push(SqStack &S, SElemType e){
	if(S.top == S.stacksize) return ERROR;//栈满
	S.data[S.top++] = e;
	return OK;
}

3、出栈

/*删除栈顶元素*/
Status Pop(SqStack &S, SElemType &e){
	if(S.top == -1) return ERROR;
	e = S.data[S.top--];
	return OK;
}

三、栈的链式存储结构——链栈

链栈是不带头节点的单链表

 

 

 

四、两栈共享空间

数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始端,即下标为0处,另一个栈为栈的末端,即下标为数组长度n-1处,这样,两个栈如果增加元素,就是两端点向中间延伸。

1、结构定义

/*两栈共享空间结构*/
typedef struct{
	SElemType data[MAXSIZE];
	int top1;//栈1栈顶指针
	int top2;//栈2栈顶指针
}SqDoubleStack;
/*插入元素e为新的栈顶元素*/
int Push(SqDoubleStack &S, SElemType e, int stackNumber){
	if(S.top1 + 1 == S.top2)//栈满
		return ERROR;
	if(stackNumber == 1)//栈1有元素进栈
		S.data[++S.top1] = e;//若栈1则top1+1后给数组元素赋值
	else if(stackNumber == 2){
		S.data[--S.top2] = e;
	}
	return OK;
}
int Pop(SqDoubleStack &S, SElemType &e, int stackNumber){
	if(stackNumber == 1){
		if(S.top1 == -1)
			return ERROR;
		e = S.data[S.top1--];
	}
	else if(stackNumber == 2){
		if(S.top2 == MAXSIZE)
			return ERROR;
		e = S.data[S.top2++];
	}
	return OK;
}

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值