剑指Offer(第二版)面试题9:用两个栈实现队列
来源:互联网 发布:原味丝袜淘宝卖家 编辑:程序博客网 时间:2024/06/03 13:55
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/71927382冷血之心的博客)
剑指Offer面试题9:用两个栈实现队列
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在对尾部插入节点和在队列头部删除节点功能。
栈是一种后进先出的数据结构,而队列是一种先进先出的数据结构。如何使用栈来实现队列呢?
思路:
首先,先建立两个栈,包括栈1和栈2。在入栈操作时,我们将节点push到栈1中。
其次,出栈操作时,判断栈2是否有节点,若有,则直接pop栈2;反之,判断栈1是否也为空,若为空,则抛出异常;反之,将栈1节点依次弹出,再存入栈2中,最后,从栈2中弹出一个元素。
实现代码如下:
/* * 剑指Offer面试题9:用两个栈实现队列 * 题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在对垒尾部插入节点 * 和在队列头部删除节点功能。 */class MyQueue<T>{// 定义两个堆栈Stack<T> stack1 = new Stack<>();Stack<T> stack2 = new Stack<>();/** * 所有的元素都插入在stack1中 * @param n */public void appendTail(T n){stack1.push(n);}/** * 删除元素从stack2中删除;若stack2为空,则将stack1中的元素取出,放入stack2中,之后再次从stack2中取出元素删除。 * @return */public T deleteHead(){if(stack2.isEmpty()){while(!stack1.isEmpty()){stack2.push(stack1.pop());}}if(stack2.isEmpty()){try {throw new Exception("队列中没元素啦");} catch (Exception e) {e.printStackTrace();}}return stack2.pop();}}
面试题9:用两个队列实现一个栈
思路:
将元素都存入queue1中,当执行pop出栈操作时,将queue1中的节点依次出列,并且添加到queue2中,将最后一个出列的节点删除并且返回,则搞定。
java代码如下:
/* * 相关题目:用两个队列实现一个栈 */class MyStack<E>{// 定义两个队列Queue<E> queue1 = new LinkedList<>();Queue<E> queue2 = new LinkedList<>();public void push(E n){queue1.add(n);}public E pop(){if(queue1.isEmpty()&queue2.isEmpty())try {throw new Exception("栈中没元素啦");} catch (Exception e) {e.printStackTrace();}// 若队列1不为空if(!queue1.isEmpty()){while(queue1.size()>1){queue2.add(queue1.remove());}return queue1.remove();}// 当队列1为空时,操作队列2while(queue2.size()>1){queue1.add(queue2.remove());}return queue2.remove();}public E peek(){if(queue1.isEmpty()&queue2.isEmpty())try {throw new Exception("栈中没元素啦");} catch (Exception e) {e.printStackTrace();}// 若队列1不为空if(!queue1.isEmpty()){while(queue1.size()>1){queue2.add(queue1.remove());}return queue1.peek();}// 当队列1为空时,操作队列2while(queue2.size()>1){queue1.add(queue2.remove());}return queue2.peek();}}
如果是使用一个队列来实现栈,可以使用双端队列,详见:如何自定义实现堆栈?
如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~
1 2
- 剑指Offer(第二版)面试题9:用两个栈实现队列
- 【剑指offer】面试题 9:用两个栈实现队列
- 剑指offer--面试题9:用两个栈实现队列
- 【剑指offer】面试题9:用两个栈实现队列
- 剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈
- 剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈
- 剑指offer-->面试题7 用两个栈实现队列
- [剑指offer][面试题07]用两个栈实现队列
- 《剑指Offer》面试题-用两个栈实现队列
- 《剑指offer》面试题七 用两个栈实现队列
- 【剑指offer】面试题7:用两个栈实现队列
- 剑指Offer:面试题7 用两个栈实现队列
- 《剑指Offer》面试题7:用两个栈实现队列
- 【剑指offer】 面试题7: 用两个栈实现队列
- 【剑指offer】面试题7:用两个栈实现队列
- 《剑指Offer》面试题:用两个队列实现一个栈
- 剑指offer-面试题7:用两个栈实现队列
- 剑指offer面试题之用两个栈实现队列
- 每天学一点Swift----运算符与表达式(二)
- Struts2 向值栈中放数据的方法
- vector中insert()的用法详解
- 友元函数友元类
- 移动端数据库神器-Realm 项目配置(入门一)
- 剑指Offer(第二版)面试题9:用两个栈实现队列
- 【机器学习实战-python3】利用SVD简化数据
- C++中指针和引用的异同
- java--十进制转化为二进制、十进制转化为十六进制、查表法十进制--十六进制、查表法十进制二进制、
- codeforce A. Bank Robbery
- 多线程之读写锁
- Android studio——启动时禁止更新
- 文件服务器—NFS
- 知识总结5.14