问题一:用两个队列实现一个栈
思路:
定义两个队列分别为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();
}
}
};