数据结构之栈的总结01

1. 栈的定义

栈(stack)是限定仅在表尾进行插入和删除操作的线性表

允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。

栈又被称为后进先出(Last in First out)的线性表,简称LIFO结构。

2. 栈的操作

栈的插入操作,称为进栈,也称为压栈、入栈;

栈的删除操作,称为出栈,也叫做弹栈;

3. 栈的定义

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

4. 栈的顺序存储结构——进栈

Status Push(SqStack *S, SElemType e)
{
	if (S->top == MAX_SIZE - 1) //栈满
	{
		return ERROR;
	}

	S->top++;                   //栈顶指针加1
	S->data[S->top] = e;        //新插入的元素赋值给栈顶空间
	return OK;
}

5. 栈的顺序存储结构——出栈

Status Pop(SqStack *S, SElemType *e)
{
	if (S->top == - 1) //栈空
	{
		return ERROR;
	}

	*e = S->data[S->top]; //将要删除的栈顶指针赋值给e
	S->top--;             //栈顶指针减一
	return OK;
}

6. 两栈共享空间

前提: 两个具有相同数据类型的栈。

优点:节省存储空间。

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

6.1 空间结构

typedef struct {
	SElemType data[MAX_SIZE];
	int top1;   //栈1的栈顶指针
	int top2;   //栈2的栈顶指针
};

6.2 入栈

Status Push(SqDoubleStack *S, SElemType e, int type) //type用来区分栈1还是栈2
{
	if (S->top1 + 1 == S->top2) //栈满
		return ERROR;

	if (type == 1) //栈1有元素入栈
	{
		S->data[++S->top1] = e; //top1 + 1后给数组赋值
	}
	else if (type == 2) //栈2有元素入栈
	{ 
		S->data[--S->top2] = e; //top2 - 1后给数组赋值
	}

	return OK;
}

6.3 出栈

Status Pop(SqDoubleStack *S, SElemType *e, int type) //type用来区分栈1还是栈2
{
	if (type == 1)
	{
		if (S->top1 == -1) //栈1为空
		{
			return ERROR;
		}
		*e = S->data[S->top1--];  //将栈1的栈顶元素出栈
	}
	else if (type == 2)
	{
		if (S->top2 == MAX_SIZE) //栈2为空 溢出
		{
			return ERROR;
		}
		*e = S->data[S->top2++];  //将栈2的栈顶元素出栈
	}

	return OK;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值