数据结构的栈与队列

最近学习Linux,讲到了进程线程这一方面的内容,其中最重要的进程调度算法,有一个时间片轮转调度算法,怎么也搞不懂,听其他同学说可以从栈和队列这一方面去理解,所以我又回来重新复习了一下栈与队列的基本知识,相较于刚学栈与队列的时候,现在又有了新的理解。使用的教材是《算法导论》。

在这一章的内容中引入了动态集合的内容,那么什么是动态集合呢?书中的原话是这样的,如同在数学中一样,集合也是计算机科学的基础,不过数学中的集合是不变的,而算法所操作的集合是可以随时间的改变而增大、缩小或产生其他的变化,这就是动态集合。而栈与队列就是这样的动态集合。我对这句话的理解是,在数学中,集合是固定长度的,例如C={1,2,3,4,5,6}。如果我没记错的话就是一个集合,他只有6个数,而且内容也是固定的,而算法所操作的集合是可以随实际情况与需求来改变其内容与大小的。我姑且也就先这么理解的,虽然自己心里也没底。然后是主要内容,是用数组的形式来实现栈与队列:

栈。

1、特点:后进先出(先删除存留时间短的元素);

与其说后进先出、先进后出,我觉得先删除存留时间短的元素更加好理解,因为前一个说法很容易让我搞混,脑子要想好久才能转过来。当然有很多关于栈的生活中的例子,太多太多,如电梯,一摞盘子的使用等。

2、专用语:Insert操作叫Push(压入),Delete操作叫POP(弹出);S[1...n]表示一个至多有n个元素的栈;top[S]表示指向栈顶元素的指针;

S[1...top[S]]表示由S实现的栈包含的所有的元素,注意与S[1...n]区分,栈的容量有n这么大,但是不一定填满,其中已经填入的部分就用S[1...top[S]]来表示;

S[1]表示栈底;S[top[S]]表示栈顶元素。S[0]没有元素。

3、操作:

STACK-EMPTY:判断栈是否为空。思路:top[S]=0时表示栈中没有元素,此时栈S是空栈。

Push:将元素压入栈中。思路:将top[S]指针向上移一位,向top[S]中插入元素。但是还有一种情况,当top[S]=n时,表示栈已经达到最大索引位置,此时若再插入元素,会造成栈的上溢。应当对这一种情况做出相应处理。

Pop:将元素从栈中探出。思路:将top[S]指针向下移一位即可。还有一种情况,当top[S]=0时,栈中已经没有元素了,此时若再弹出元素,会造成栈的下溢。

队列

1、特点:先进先出(先删除存留时间最长的元素)。这个就很好想了,生活中的例子也很多,最典型的就是排队打饭的情况,当然不将插队考虑在内。

2、专用语:Insert操作叫入队(ENQUEUE),delete操作叫出队(DEQUEUE);

Q[1...n]一个至多含有n-1个的元素队列;head[Q]代表队列的头,元素出队的地方;tail[Q]代表队列的尾,是新元素插入的地方。

3、说明:队列的首尾连成一个环,其中各个元素用head[Q]、head[Q]+1、。。。tail[Q]-1来表示;当head[Q]=tail[Q]时队列为空(tail[Q]没有元素),当head[Q]=tail[Q]+1时队列为满的。我觉的这个地方不太好想,别忘了这四个前提:head[Q]、tail[Q]代表索引,队列是一个环,只能从tail[Q]插入元素,tail[Q]没有元素。有了这几个前提还不会的话就在这几个前提之下画一个图,数组的就可以。

4、操作:

ENQUEUE:从tail[Q]处插入元素,再将tail[Q]移向下一个位置;注意处理其他情况,就是队列已满的情况,tail[Q]+1=head[Q]。

DEQUEUE:将head[Q]移向下一个位置;注意溢出情况处理,head[Q]=tail[Q],此时不能再弹出元素。

以上就是栈与队列的我所了解的内容,要我说队列有些人性化,谁等的久先让谁出,而栈就有些流氓了,谁先进来让谁先出去,人家等的久的就让他等着。当然这也是取决于这两种结构的特点,栈只有一个头控制元素的进出,而队列有一个头管出元素,一个尾管进元素,这样的结构决定了他们这样的特点。、

小白日记,欢迎批评。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值