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年以前,那就不能使用这个函数。那就老老实实把数据从栈2放到栈1里面去。
(2)还有一个函数emplace(),也是C++11里面的函数,这里我只是简单介绍一下它,emplace(),构造和插入元素,在顶部添加一个新的元素,新元素被构造成args,作为构造函数的参数,比如:我有一个栈s1,栈里有没有元素现在不关注,我知道这个栈里面元素类型,现在我想往里面插入一个元素,假设它是int型的,那么我要插入一个8,就可以这样写:s1.emplace(8);之后再看栈里面的数据栈顶多了一个8,栈的大小size()比原来增加了1。
二、代码实现StoQ
现在我相信,经过看来上面的详细介绍,你们心里应该有一点feel了吧,下面呈上我的代码:
#pragma once