您的位置:首页 > 其它

两个栈实现队列

2015-08-01 17:15 274 查看
某搜索公司实习面试的时候有这么一道题,当时没答对,《剑指offer》一书里面也详细讲解了,自己再总结消化一遍

题目:用两个栈实现一个队列

栈和队列是数据结构的基本概念

栈(stack)是指一种先入后出(first in last out)的数据结构,在现实中通俗的例子是一个只有上面有入口的货仓,先放进去的货物落在最底下,后放进去的货物在最表层,所以后放入的货物可以先取出,先放入的货物要等后放入的货物取完后才能轮得到

栈对应的操作是入栈(push)和出栈(pop),入栈相当于存入货物,出栈相当于取出货物

在程序底层实现中,栈用来保存局部的变量,比如,c/c++的函数输入参数是一个传值得过程,可以用objdump之类的反汇编工具看看c函数的汇编代码。参数列表的前几个参数通常可以保存在通用寄存器,如果参数很多,比如一个函数有十多个输入参数,那么没有这么多寄存器资源保存,这时就需要栈来完成。具体就是函数会先分配一个一定大小的内存空间作为栈,将寄存器无法保存的参数列表函数的返回地址等入栈,函数内部计算过程中如果没有足够的寄存器,局部数据也是保存在栈里面。函数的栈空间有一定的大小限制,具体大小不太记得,比如在函数中定义一个很大很大的数组,运行的时候会报错,自己当时经历过这个问题,可以做个试验验证下。

队列

队列(queue)是指一种先入先出(first in first out)的数据结构,现实生活中的例子就是排队,先来先到。

队列在其他算法中会经常用到,比如二叉树按层遍历。在实际工程中队列用作数据缓存fifo,比如做视频编码,各个模块间数据的传输管理等,涉及生产者消费者模型之类的。

解答

一个栈用作存数一个栈用作取数,就称为入队栈和出队栈

入队(enque):入队栈push

出队(deque):

如果出队栈为空,则将所有入队栈的数据先pop出来然后再push进出队栈,然后在出队栈中pop出一个数据,即为出队的数据。这样入队栈最先pop出来的数是最晚进来的,它最先push进出队栈,相当于在仓库最里面,符合队列的逻辑

如果出队栈非空,则出队栈pop出一个数

如果两个栈都空了,则队列是空

例子:

1,2,3三个数按顺序先入队,那么入队栈的数据为3,2,1(栈底)

出队:入队栈的数依次出栈,然后入栈进出队栈,入队栈的为空,出队栈的数据位1,2,3(栈底),然后出队栈pop一个数1,出队栈变为2,3(栈底)

入队4:入队栈push,入队栈变为4,出队栈还是2,3(栈底)

出队:出队栈pop出2,变为3,入队栈不变还是4

出队:出队栈pop出3,变为空,入队栈不变还是4

出队:出队栈为空,所以将入队栈的4先pop出来,然后push进出队栈,然后出队栈pop出来,4

至此入队的四个数1,2,3,4也按顺序依次出队1,2,3,4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: