LeetCode 用队列实现栈

使用队列实现栈的下列操作:

push(x) -- 元素 x 入栈
pop() -- 移除栈顶元素
top() -- 获取栈顶元素
empty() -- 返回栈是否为空

注意:

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

请先翻阅 LeetCode 用栈实现队列
队列:先进先出特性,只能在队头出队,队尾入队操作。
栈:先进后出特性,只能在栈顶出栈、入栈操作。
双端队列:队头、队尾都可进行入队、出队操作。
LeetCode 用队列实现栈_第1张图片LeetCode 用队列实现栈_第2张图片LeetCode 用队列实现栈_第3张图片
方法一:使用deque双端队列的辅助。

双端队列的一些操作:
deque.back(); //获取队尾
deque.front(); //获取队头
deque.pop_back(); //队尾出队
deque.pop_front(); //队头出队
deque.push_back(); //队尾入队
deque.push_front(); //队尾入队

代码实现

class MyStack {
private:
	deque myQue;
public:
	/** Initialize your data structure here. */
	MyStack() {
        
	}
	
	/** Push element x onto stack. */
	void push(int x) {//直接放入队列尾部
		myQue.push_back(x);
	}
	
	/** Removes the element on top of the stack and returns that element. */
	int pop() {
		int top = myQue.back();//获取队尾
		myQue.pop_back();//队尾出队
		return top;
	}
	
	/** Get the top element. */
	int top() {
		return myQue.back();//获取队尾
	}
	
	/** Returns whether the stack is empty. */
	bool empty() {
		return myQue.empty();
	}
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * bool param_4 = obj.empty();
 */

LeetCode 用队列实现栈_第4张图片
感觉双端队列体现不出我的思考,还是老老实实使用队列模拟。
方法二:使用队列进行模拟。

class MyStack {
private:
	queue myQue;
	//将队列的前n-1个元素放到队列的尾部
	void myOp(){
		int queSize = myQue.size();
		for (int i = 1; i < queSize; ++i){
			myQue.push(myQue.front());
			myQue.pop();
		}
	}
public:
	/** Initialize your data structure here. */
	MyStack() {
        
	}
	
	/** Push element x onto stack. */
	void push(int x) {//直接放入队列
		myQue.push(x);
	}
	
	/** Removes the element on top of the stack and returns that element. */
	int pop() {
		myOp();//将队列的前n - 1个元素放到尾部
		int top = myQue.front();
		myQue.pop();
		return top;
	}
	
	/** Get the top element. */
	int top() {
		myOp();//将队列的前n - 1个元素放到尾部
		int top = myQue.front();
		myQue.pop();
		myQue.push(top);
		return top;
	}
	
	/** Returns whether the stack is empty. */
	bool empty() {
		return myQue.empty();
	}
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * bool param_4 = obj.empty();
 */

LeetCode 用队列实现栈_第5张图片

你可能感兴趣的:(LeetCode)