一、如何只使用队列来实现栈结构
因为队列的结构是先进后出,而栈的数据结构特点是先进先出,所以我们可以搞两个队列,当一个队列进入另外一个队列的时候,只剩下一个元素,留着返回,然后这个队列再进入原来哪个队列只剩下一个元素等着返回,循环使用这个逻辑,即可完成。
/* * 两个队列实现栈结构 */ public static class TwoQueuesStack { //data队列和help队列,使用的是双向链表来完成的 private Queue<Integer> queue; private Queue<Integer> help; public TwoQueuesStack() { queue = new LinkedList<Integer>(); help = new LinkedList<Integer>(); } public void push(int pushInt) { queue.add(pushInt); } public int peek() { if (queue.isEmpty()) { throw new RuntimeException("Stack is empty!"); } while (queue.size() != 1) { help.add(queue.poll()); } int res = queue.poll(); //因为不弹出 所以还得把它放进help栈里 help.add(res); swap(); return res; } public int pop() { if (queue.isEmpty()) { throw new RuntimeException("Stack is empty!"); } //当data队列的长度不为1时往help队列中 while (queue.size() != 1) { help.add(queue.poll()); } //然后把队列的最后一个元素添加到res中 int res = queue.poll(); swap(); return res; } //交换引用,目的就是,都能重复使用是Data队列往help队列里放值,并留下最后一个数留着返回 private void swap() { Queue<Integer> tmp = help; help = queue; queue = tmp; } }
二、只利用栈来实现队列
因为栈是先进后出的,队列是先进先出的,所以也可以利用两个栈区实现队列这种数据结构就是先把数据放到push栈里,再把push栈里的数据倒入pop栈里,出栈只从pop栈里出,这样就实现了两个栈完成队列的功能,但是要注意的是,当pop中有数据的时候千万不要从push往pop栈里倒数据,因为数据顺序会出现问题,第二要满足push栈有数据一定一下倒完。
/* * 实现使用栈来完成队列的操作 */ public static class TwoStacksQueue { private Stack<Integer> stackPush; private Stack<Integer> stackPop; public TwoStacksQueue() { stackPush = new Stack<Integer>(); stackPop = new Stack<Integer>(); } public void push(int pushInt) { stackPush.push(pushInt); dao(); } public int poll() { if (stackPop.empty() && stackPush.empty()) { throw new RuntimeException("Queue is empty!"); } else if (stackPop.empty()) { while (!stackPush.empty()) { stackPop.push(stackPush.pop()); } } dao(); return stackPop.pop(); } public int peek() { if (stackPop.empty() && stackPush.empty()) { throw new RuntimeException("Queue is empty!"); } else if (stackPop.empty()) { while (!stackPush.empty()) { stackPop.push(stackPush.pop()); } } dao(); return stackPop.peek(); } //满足当当pop栈没数据和push栈一次全倒的前提下把push栈的数据倒入pop栈中 public void dao(){ if(stackPush.isEmpty()){ while(!stackPop.isEmpty()){ stackPop.push(stackPush.pop()); } } } }