正如标题所述,你需要使用两个栈来实现队列的一些操作。
队列应支持push(element),pop() 和 top(),其中pop是弹出队列中的第一个(最前面的)元素。
pop和top方法都应该返回第一个元素的值。
样例
比如push(1), pop(), push(2), push(3), top(), pop(),你应该返回1,2和2
思路:
队列的push操作:
将数据压入到栈1即可。
队列的pop操作:
需要两个栈,因为push进stack1的数据是不符合先进先出的,需要将是stack1中的数据压入stack2中,再pop,则符合先进先出。
首先判断栈2是否为空,若为空,则将栈1的数据压入栈2 ,否则直接将栈2的值返回并pop
代码:
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
int value=0;
if(stack2.empty())//若栈2空
{
while(!stack1.empty())
{
value=stack1.top();
stack2.push(value);
stack1.pop();
}
}
value=stack2.top();
stack2.pop();
return value;
}
private:
stack<int> stack1;
stack<int> stack2;
};
受到上题的启发
思考:用两个队列模拟一个栈
思路:队列只能从队尾添加数据,从队首删除数据。
栈的push操作:将数据push进queue1即可
栈的pop操作:
队列是先进先出,而栈要求是先进后出,又因为队列只能从队首删除数据,因此如果想要首先删除队尾数据,需要将queue1中保留一个数据,其余的数据删除到并保存在queue2中。 每次删除时间复杂度O(N)
template <typename T>
class CStack
{
public:
CStack(void)
{}
~CStack(void)
{}
void appendTail(const T& node);
T deleteHead();
private:
queue<T> q1;
queue<T> q2;
};
template<class T>
void CStack<T>::appendTail(const T& node)//在栈尾部添加数据
{
if (!q1.empty())//不为空的执行push操作
{
q1.push(node);
}
else
{
q2.push(node);
}
}
template<class T>
T CStack<T>::deleteHead()
{
int ret = 0;
if (q1.empty())
{
int i = q2.size();
while (i > 1 )//将q2队列中的数据pop到只剩一个
{
q1.push(q2.front());
q2.pop();
--i;
}
ret = q2.front();
q2.pop();
}
else
{
int i = q1.size();
while (i > 1)
{
q2.push(q1.front());
q1.pop();
--i;
}
ret = q1.front();
q1.pop();
}
return ret;