数据结构与算法知识总结二

堆栈和队列是特殊的线性表
一、堆栈简称为栈LIFO(Last In First Out),是限定只能在表的一端进行插入和删除操作的线性表。有两种存储结构:1、顺序栈-采用顺序结构存储 2、链栈-采用链式结构存储,只对顺序栈进行介绍,如下图所示,插入元素时,从栈顶插入,由于限定只能在一端进行操作,所以删除元素时也应当是从栈顶开始删除,遵循先进先出的原则。这就比如在生活中,我们假设把五个碗从a1到a5依次重叠起来摆放在一起,当我们要拿最低下a1的那个碗时,我们是不是应该从最上面a5开始拿,从a5开始拿一直到a1为止。

栈满:top=Maxsize-1,栈空:top=-1。
在这里插入图片描述
下面为顺序栈的基本算法:
1、初始化堆栈 StackInit()
SeqStack StackInit()
{
SeqStack s;
s.top=-1;
return(s);
}
2、判定栈s是否为空StackEmpty(s)
int StackEmpty(SeqStack s)
{ return(s.top==-1);
}
3、求堆栈s的长度StackLength(s)
int StackLength(SeqStack s)
{
return(s.top+1);
}
4、获取栈顶元素的值GetTop(s)
ElementType GetTop(SeqStack s)
{ if (StackEmpty(s))/空栈/
return(nil);
return(s.elem[s.top]);
}
5、进栈Push(s, e)
void Push(SeqStack s, ElementType e)
{ if (s->top== MaxSize-1) /栈满/
printf(“Full”);
else
{
s->top++;
s->elem[s->top]=e ;
}
}
6、出栈Pop(s)
ElementType Pop(SeqStack s)
{ if (s->top== -1) /栈空/
return(nil);
/
返回空值
/
else
{ e=s->elem[s->top];
s->top–;
return (e);
}
}

二、队列简称为队,如下图所示,是限定只能在表的一端作插入运算、在另一端作删除运算的线性表;在表中,允许插入的一端称为“队尾(rear)”,允许删除的另一端称为“队首(front)”。队列也是有两种存储结构:1、顺序队列-采用顺序结构存储 2、链式队列-采用链式结构存储,只对顺序队列进行介绍。顺序队列在生活中就像排队打饭一样,讲究的是先来后到,假设有五个人在排队依次从a1到a5(这时rear会+ +等于5),根据顺序队列的原则,a1是最先得到服务出队列的直到a5结束(这时front会- -等于5),所以空队为:frontrear
在这里插入图片描述
队满:rear
Maxsize-1
当rear=MaxSize-1时,队列为满,如果再加入新元素,就会产生"溢出"。如下图,在数组的前端还可能有空位置,所以这是一种假溢出。
在这里插入图片描述
解决办法:循环队列
为了能够充分的使用数组中的存储空间,把数组的前端和后端连接起来,形成一个环形的表,即把存储队列元素的表从逻辑上看成一个环,成为循环队列。下图是队满的几种情况,浪费掉一个空间使得更好表现队列为满的情况,循环队列为满的条件是:front==(rear+1) % MaxSize,使用取余的方法,得到队列为满(归零),如:(4+1)=5,MaxSize=5,5除5取余等于0,这时队列为满
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值