LeetCode 225. 用队列实现栈

使用队列实现栈的下列操作:
push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空

注意:
你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。

思路1:

  1. 因为栈和队列的存储方式是完全相反的,所以用两个队列实现栈。
  2. 当有新元素要push时,用一个队列暂时存储之前的栈,另一个队列pop空,先压入新元素,再把暂时存储之前的栈的队列再一次push进队列中。
  3. 这样,队列中的元素顺序就是栈结构的顺序了。

代码1:

public class duigozhan225 {

	private Queue queueA;
	private Queue queueB;

	public duigozhan225() {
		queueA = new LinkedList();
		queueB = new LinkedList();
	}

	public void push(int x) {
		if (!queueA.isEmpty()) {
			queueA.add(x);
		} else {
			queueB.add(x);
		}
	}

	public int pop() {
		int result = 0;
		if (!queueA.isEmpty()) {
			while (queueA.size() > 1) {
				queueB.offer(queueA.poll());
			}
			result = queueA.poll();
		} else {
			while (queueB.size() > 1) {
				queueA.offer(queueB.poll());
			}
			result = queueB.poll();
		}
		return result;
	}

	public int top() {
		int result = 0;
		if (!queueA.isEmpty()) {
			while (queueA.size() > 1) {
				queueB.offer(queueA.poll());
			}
			result = queueA.poll();
			queueB.offer(result);
		} else {
			while (queueB.size() > 1) {
				queueA.offer(queueB.poll());
			}
			result = queueB.poll();
			queueA.offer(result);
		}
		return result;
	}

	public boolean empty() {
		return queueA.isEmpty() && queueB.isEmpty();
	}

	public static void main(String[] args) {
		duigozhan225 obj = new duigozhan225();
		obj.push(1);
		System.out.println(obj.top());
		obj.push(2);
		System.out.println(obj.top());
		obj.empty();
		System.out.println(obj.empty());
	}
}

思路2:

用一个队列实现栈:通过循环遍历,将队头元素出队且重新入队,循环次数为队列长度-1,这样就实现后进先出的机制。

代码2

public class Duigozhan225two {
	private Queue queue;

	Duigozhan225two() {
		queue = new LinkedList();
	}

	public void push(int x) {
		queue.add(x);
		for (int i = 1; i < queue.size(); i++) {
			queue.add(queue.poll());
		}
	}

	public void pop() {
		queue.poll();
	}

	public int top() {
		return queue.peek();
	}

	public boolean empty() {
		return queue.isEmpty();
	}
}

你可能感兴趣的:(LeetCode)