剑指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