堆栈和队列

堆栈

堆栈是限定插入和删除操作都在表的同一端进行的线性表。允许插入和删除元素的一端称为栈顶,另一端称为栈底。若栈中无元素,则称为空栈。一定要记住的是:栈有后进先出的特点,Lase In First Out,LIFO。

栈的基本操作除了插入和删除外,还有建立和撤销栈等操作。

Creat():建立一个空栈;

Destroy():撤销一个栈;

IsEmpty():若栈为空,则返回true,否则返回false;

IsFull():若栈满,则返回true,否则返回false;

Top(x):在x中返回栈顶的元素,若操作成功,则返回true;否则返回false‘

Push(x):在栈顶插入元素x,即入栈。若操作成功,则返回true;否则返回false;

Pop():从栈中删除栈顶元素,即出栈,若操作成功,则返回true。否则返回false;

Clear():清除堆栈中全部元素。

当然,堆栈也是有顺序表示和链接表示两种表示方式。顺序栈使用了一维数组的方式来实现,而顺序栈使用的链表的方式来实现。两个表示方式的优缺点可以参考一维数组和单链表的优缺点分析。

 

队列

队列是限定在表的一端插入,在表的另一端删除的线性表。允许插入元素的一端称为队尾,允许删除元素的另一端称为队头。若队列中没有元素,则称为空队列。对于队列而言,出队的顺序与入队相同,所以它是先进先出的线性表,First In First Out。

队列的基本操作除了入队和出队之外,还有建立和撤销队列等操作。

Creat():建立一个空队列;

Destroy():撤销一个队列;

IsEmpty():若队列为空,则返回true,否则返回false;

IsFull():若队列满,则返回true,否则返回false;

Front(x):在x中返回队头元素,操作成功返回true,否则返回false;

EnQueue(x):在队尾插入元素x,操作成功返回true,否则返回false;

DeQueue():从队列中删除队头元素,操作成功返回true,否则返回false;

Clear():清除堆栈中全部元素。

 

由于队列是先进先出的特点,所以在队列的顺序表示中会出现一个问题:“假溢出”。下面我们详细解释一个该现象,而且给出解决方法。

我们使用front和rear分别指向队列的头元素和尾元素,我们首先建立一个空队列。然后让20、30、40、50依次入队,就是下图b;然后20、30、40依次出队,如下图c。这个过程我们需要注意观察队列先进先出的特点。在元素入队时,先将队尾指针加1,然后元素入队;元素出队时,先将队头指针加1.然后元素出队。这时,我们把60入队,如果我们还想再让后面的70等等元素入队,就会出现溢出的现象。但是我们仔细观察又发现,该队列中队头位置还处在3个位置的空缺,那么这种队头位置有空缺,队尾反而出现溢出的现象就称为“假溢出”!


一种改进方法是采用循环队列结构,即把数组从逻辑上堪称是一个头尾相连的环,再有新元素需要入队时,就可以将新元素存入下标0的位置。为了使入队和出队实现循环,可以利用取余运算符%:

队头指针进1: front=( front+1)%maxSize;

队尾指针进1:rear=(rear+1)%maxSize;

在循环队列结构下,当front==rear时空队列,当(rear+1)%maxSize==front时为满队列。注意满队列时实际仍有一个元素的空间未使用。若不留这个元素的空间,则队尾指针rear一定指向该元素空间,使得满队列时的判断条件也是(front==rear),则与空队列的判断条件相同而导致无法区分。


堆栈的应用

计算后缀表达式的值。尽管中缀表达式是普遍使用的书写形式,但在编译程序中常用表达式的后缀形式求值,原因是后缀表达式中无括号,计算时无需考虑操作符的优先级,因而计算简单。把操作数之后的表达式称为后缀表达式,又称为逆波兰表达式。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值