【data structure】之栈与队列

问题一:用两个队列实现一个栈

思路:

  定义两个队列分别为q1,q2。

  调用栈的push操作时,直接将元素push到队列q1中,时间复杂度为O(1)。

  调用栈的pop操作时,先把q1中的q1.size() - 1个元素push到q2中,然后再pop出q1中的最后一个元素,再把q2中的所有元素全部push到q1中,时间复杂度为O(n)。

代码:

  

template<typename T>
class Stack
{
	queue<T> q1;
	queue<T> q2;

public:
	void push(T i)
	{
		q1.push(i);
	}

	void pop()
	{
		while (q1.size() > 1)
		{
			q2.push(q1.front());
			q1.pop();
		}

		cout << q1.front() << endl;
		q1.pop();

		while (q2.size() > 0)
		{
			q1.push(q2.front());
			q2.pop();
		}
	}
};

问题二:用两个栈实现一个队列

思路:

  定义两个栈分别为s1,s2。

  调用队列的push操作时,直接将元素push到队列s1中,时间复杂度为O(1)。

  调用队列的pop操作时,先把s1中的所有元素push到s2中,然后再调用s2的pop操作,再把s2中的所有元素全部push到s1中,时间复杂度为O(n)。

代码:

template<typename T>
class Queue
{
	stack<T> s1;
	stack<T> s2;

public:
	void push(T i)
	{
		s1.push(i);
	}

	void pop()
	{
		while (!s1.empty())
		{
			s2.push(s1.top());
			s1.pop();
		}
		cout << s2.top() << endl;
		s2.pop();
		while (!s2.empty())
		{
			s1.push(s2.top());
			s2.pop();
		}
	}
};


你可能感兴趣的:(structure)