LeetCode-225. 用队列实现栈

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

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

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

 

基础题,测试数据太少了。应该多一点就好!

#include <iostream>
#include <queue>
using namespace std;

/* 两个队列实现栈,这是经典题目了,可以画一张图进行编程 */

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

	}

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

		/* 保证 m_queue1 中只有最后1个数据,这样pop的时候,一定会是最上层的数据 */
		while (m_queue1.size() > 1) {
			int front = m_queue1.front();
			m_queue2.push(front);
			m_queue1.pop();
		}
	}

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

		/* 因为只有一个数据,所以 m_queue1 pop之后必定为空 */
		if (m_queue1.empty()) {

			/* 这个时候把 m_queue2 的数据直接通过 move 到 m_queue1 上面来, m_queue2清空  */
			m_queue1 = std::move(m_queue2);

			// 原来手动清空
			//while (!m_queue2.empty()) {
			//    m_queue2.pop();
			//}

			/* 保证 m_queue1 中只有最后1个数据,这样pop的时候,一定会是最上层的数据 */

			while (m_queue1.size() > 1) {
				int front = m_queue1.front();
				m_queue2.push(front);
				m_queue1.pop();
			}

		}
		return front;
	}

	/** Get the top element. */
	int top() {
		int front = m_queue1.front();
		return front;
	}

	/** Returns whether the stack is empty. */
	bool empty() {
		if (m_queue1.empty() && m_queue2.empty()) {
			return true;
		}
		else {
			return false;
		}
	}

private:
	queue<int> m_queue1;  //表示队列1
	queue<int> m_queue2;  //表示队列2
};

/**
 * 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();
 */

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值