leetcode刷题/栈和队列 225. 用队列实现栈

225. 用队列实现栈

题意:

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

注意:

你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

示例:

输入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]

解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False
解题思路:

这道题我是利用两个队列来完成的,一个用来添加,一个用来暂存.

  • 添加只需要加入添加队列即可.
  • 删除需要循环 size-1 次, 每次弹出来一个元素存在暂存队列,直到让最后一个元素成为第一个元素.取到元素之后把元素删除,然后让暂存队列的值赋给添加队列.清空暂存队列(自己写一个clear函数,用swap会快很多)
  • 取栈顶先让暂存队列等于添加队列,然后根据上面一样的操作得到最后一个元素.得到后然添加队列复原,返回元素即可
  • 判空只需要判断两个队列是否同时为空
代码:
void clear(queue<int> &q)
{
	queue<int> empty;
	swap(empty, q);
}

class MyStack {
public:
	queue<int> q_input;
	queue<int> q_output;

	/** Initialize your data structure here. */
	MyStack() {

	}

	/** Push element x onto stack. */
	void push(int x) {
		q_input.push(x);
	}

	/** Removes the element on top of the stack and returns that element. */
	int pop() {

		int size = q_input.size();
		while (--size)
		{
			q_output.push(q_input.front());
			q_input.pop();
		}
		int x = q_input.front();
		q_input.pop();
		q_input = q_output;
		clear(q_output);

		return x;
	}

	/** Get the top element. */
	int top() {
		int size = q_input.size();
		while (--size)
		{
			q_output.push(q_input.front());
			q_input.pop();
		}
		int x = q_input.front();
		q_output.push(q_input.front());
		q_input = q_output;
		clear(q_output);

		return x;
	}

	/** Returns whether the stack is empty. */
	bool empty() {
		if (q_input.empty() && q_output.empty())
			return true;
		return false;
	}
};
运行结果:

leetcode刷题/栈和队列 225. 用队列实现栈_第1张图片

总结:

队列实现栈其实可以不用两个队列的,只需要出队的时候重新入队.但是我做的时候没想那么多,觉得行得通就做了,用的空间比较大.

你可能感兴趣的:(leetcode刷题/栈和队列,队列,数据结构,栈,leetcode,c++)