剑指Offer面试题7用两个栈实现队列(附带用两个队列实现栈)

来源:互联网 发布:印度人在中国 知乎 编辑:程序博客网 时间:2024/05/17 08:48

面试题7:用两个栈实现队列

完成两个函数appendTail和deletedHead,分别是在队列尾部插入节点和在队列头部删除节点的功能。

思路:添加元素即压入一个栈s1,删除元素的话,把s1中的元素按顺序先弹出再压入栈s2中,这是弹出栈s2的元素就能实现先进先出了。

相关题:用两个队列实现栈。

思路:添加元素即向一个队列q1添加元素,删除元素的话,把q1的元素按顺序出队然后入队到q2,最后q1剩下一个元素,就是要出栈的元素,再添加元素的话,向非空的队列添加。

用两个栈实现队列的Java实现:

public class CQueue {private Stack<Integer> stack1 = new Stack<>();private Stack<Integer> stack2 = new Stack<>();public void appendTail(int elem){//添加元素就直接向stack1添加stack1.push(elem);System.out.println("stack1:" + stack1.toString());}public void deleteHead(){//删除分三种情况:1,stack2不空,直接从它里头弹出。2,stack2空,stack1不空,把1中先弹再压到2,再从2弹出。3,两都空。if(!stack2.isEmpty()){stack2.pop();}else if(!stack1.isEmpty()){while(!stack1.isEmpty()){stack2.push(stack1.pop());}stack2.pop();}else{System.out.println("两个栈都空了");}System.out.println("stack1:" + stack1.toString());System.out.println("stack2:" + stack2.toString());}public static void main(String[] args) {CQueue test = new CQueue();test.appendTail(1);test.appendTail(2);test.appendTail(3);test.deleteHead();test.deleteHead();test.appendTail(4);test.deleteHead();}}

用两个队列实现栈的Java实现:

import java.util.Queue;import java.util.LinkedList;//以下是相关题,两个队列实现栈。public class CStack {//是LinkedList类实现了Queue接口private static Queue<Integer> queue1 = new LinkedList<>();private static Queue<Integer> queue2 = new LinkedList<>();private void appendTail(int elem){//Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。//它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 //如果要使用前端而不移出该元素,使用element()或者peek()方法。//这里是向非空的队列里添加值。都为空的话向队列1添加。if(!queue2.isEmpty()){queue2.offer(elem);}else{queue1.offer(elem);}System.out.println("queue1:" + queue1.toString());System.out.println("queue2:" + queue2.toString());}private void deleteHead(){//一个表示空队列,一个表示非空队列Queue<Integer> emptyQueue = queue1;Queue<Integer> notEmptyQueue = queue2;if(!emptyQueue.isEmpty()){emptyQueue = queue2;notEmptyQueue = queue1;}//除了非空队列的最后一个元素,别的都按顺序移到空队列while(notEmptyQueue.size()!=1){emptyQueue.offer(notEmptyQueue.poll());}//删除刚才留下的最后一个元素notEmptyQueue.poll();System.out.println("queue1:" + queue1.toString());System.out.println("queue2:" + queue2.toString());}public static void main(String[] args) {CStack test = new CStack();test.appendTail(1);test.appendTail(2);test.appendTail(3);test.deleteHead();test.appendTail(4);test.deleteHead();}}

0 0
原创粉丝点击