Hello,今天Val来给大家分享关于利用 栈实现队列 和 利用队列来实现栈。
准备知识
1、栈 特点: 栈顶插入数据,栈顶删除数据
LIFO(last in first out)后进先出
2、队列 特点: 队列队头删除数据,队尾插入数据
FIFO(first in first out)先进先出
一、那么如何利用两个栈实现一个队列?
我们知道不管是在队列中插入数据,还是删除数据,它都有它的规则,不管我们底层怎样去实现它,都必须保证它的规则不发生改变,我们需要了解队列(queue)的接口。
基本有插入和删除操作,取队头数据,队列的大小,是否为空等。
两个栈实现一个队列:创建一个StoQS类,在类里面实现插入、删除等的接口,类里面有两个栈,一个栈存放数据,另一个栈用来辅助实现队列。
Push插入:队列插入和栈的插入一样,所以直接在类里面写函数内部利用栈的插入函数即可;
Pop删除:队列删除数据是头删(注意删除数据前要判断里面是否还有数据),如果有数据,删除内部栈的栈底数据,此时需要辅助栈来辅助实现这个功能。
二、两栈 To 队列 思想过程
1、stack 是一个容器适配器(container),它在C++库里面有构造函数(constructor()),栈的尺寸大小函数(size()),返回栈顶数据(top())
,插入(push()),删除栈顶元素(pop());
(1)还有在C++11里才有的函数swap(),它的作用是交换两个栈的数据;在两栈实现队列的Pop()功能时,我用了两个栈,先把第一个放到第二个中去,当第一个中元素剩下一个时,就相当于是队列的第一个元素了,记录它,(如果栈2非空)再把栈2中的元素放回栈1,始终以栈1为基础栈,栈2做辅助栈。
最后当我想起来栈有swap()接口时,嗯,用swap应该比较方便,当我为了拿到栈1栈底数据时,把栈1中的数据放到栈2中,当栈1剩一个元素时,删掉它,然后如果栈2非空,栈1和栈2交换即可。 同理,我在实现Front()函数时也用到了swap()函数。 如果要用swap()函数,记住一定要注意你的编译环境,C++11,是2011年出来的,如果你的编译器在11年以前