queue by one stack、two stack and three stack

来源:互联网 发布:淘宝网牛仔女装 编辑:程序博客网 时间:2024/06/10 03:48

1、用一个栈实现队列;

要想用一个栈实现队列,可以通过push过程中递归处理或者pop过程递归处理,这个方法虽然只是用了一个栈,但是是用了系统的栈。

2、使用两个栈实现队列;

一个栈用于push,另一个栈用于pop,如果pop栈空,就把push栈里面的数据放入pop栈里面。

3.用三个栈实现队列,最差的操作时间O(1);

用三个栈,从网上的结果来看,只有使用栈嵌套栈的方式才能够实现在O(1)的时间内将栈转换成队列。但是这种方式是用了n个嵌套栈,这种方式按照道理不满足需求的,不过作为一种实现思路。

初始状态:[]

插入数据a,变成:[[a][]]

插入数据b,变成[[a][[b][]]];

因此,在出栈的时候,需要pop两次,才能得到栈底的元素,当然这也是一个栈,然后pop这个栈,就可以得到目标元素了。

总结来说,就是每一层栈里面,只有两个元素,一个是下一层栈,另一个栈则保留了这一层的元素;

具体代码如下:


package com.frozenxia.algorithm.basic.exercises;import com.frozenxia.algorithm.basic.LinkedStack;public class QueuePowerdByStack<Item> {class QueueByOneStack {LinkedStack<Item> stack = new LinkedStack<Item>();public void enqueue(Item val) {stack.push(val);}public Item dequeue() throws Exception {if (stack.isEmpty())throw new Exception("stack is empty");Item val = stack.pop();if (stack.isEmpty()) {return val;}Item ret = dequeue();stack.push(val);return ret;}public boolean isEmpty() {return stack.isEmpty();}}class QueueByTwoStack {LinkedStack<Item> stack1 = new LinkedStack<Item>();LinkedStack<Item> stack2 = new LinkedStack<Item>();public void enqueue(Item val) {stack1.push(val);}public Item dequeue() {if (stack2.isEmpty()) {while (!stack1.isEmpty()) {stack2.push(stack1.pop());}}return stack2.pop();}public boolean isEmpty() {return stack1.isEmpty() && stack2.isEmpty();}}// QueueByOneStack queu1 = new QueueByOneStack();//QueueByTwoStack queu1 = new QueueByTwoStack();QueueByThreeStack queu1 = new QueueByThreeStack();public void enqueue(Item val) {queu1.enqueue(val);}public Item dequeue() throws Exception {return queu1.dequeue();}class QueueByThreeStack {LinkedStack<Object> stack1 = new LinkedStack<Object>();LinkedStack<Object> stack2 = stack1;LinkedStack<Object> stack3 = null;public void enqueue(Item key) {stack3 = new LinkedStack<Object>();stack3.push(key);stack2.push(stack3);stack3 = new LinkedStack<Object>();stack2.push(stack3);stack2 = stack3;}public Item dequeue() {stack3 = (LinkedStack<Object>) stack1.pop();stack1 = (LinkedStack<Object>) stack1.pop();Item ky = (Item) stack1.pop();stack1 = stack3;return ky;}}public static void main(String[] args) throws Exception {QueuePowerdByStack<Integer> queue = new QueuePowerdByStack<Integer>();queue.enqueue(12);queue.enqueue(13);queue.enqueue(14);System.out.println(queue.dequeue());System.out.println(queue.dequeue());queue.enqueue(15);queue.enqueue(16);System.out.println(queue.dequeue());queue.enqueue(17);System.out.println(queue.dequeue());queue.enqueue(18);System.out.println(queue.dequeue());System.out.println(queue.dequeue());}}





0 0
原创粉丝点击