问题分析:
<1>每次push都向_q1中push;
<2>**注意**:每次pop时,都先判断_q1中是否有数据;
先看_q1中是否有数据,有数据,将_q1数据移动到_q2,然后将_q2的top数据pop;_q1没有数据,将_q2数据移动到_q1,然后将_q1的top数据pop;
pop场景:
pop场景1:_q1和_q2中都没有数据,assert;
pop场景2:_q1有数据,将_q1数据移动到_q2中,将最后一个数据删除;
pop场景3:_q1为空,_q2有数据,将_q2数据移动到_q1中,将最后一个数据删除;
_q1有数据,进行pop操作:
_q1没有数据,_q2有数据,进行pop操作:
代码部分:
class TQueueCSatck
{
public:
void Push(const int x)
{
_q1.push(x);
}
bool Empty()
{
return _q1.empty() && _q2.empty();
}
void Pop()
{
assert(!Empty());
//_q1为空,证明_q2不为空
if (_q1.empty())
{
while (!_q2.empty() && _q2.size() != 1)
{
int tmp = _q2.front();
_q2.pop();
_q1.push(tmp);
}
_q2.pop();
return;
}
//_q1不为空
while (!_q1.empty() && _q1.size() != 1)
{
int tmp = _q1.front();
_q1.pop();
_q2.push(tmp);
}
_q1.pop();
}
size_t Size()
{
return _q1.size() + _q2.size();
}
protected:
queue<int> _q1;
queue<int> _q2;
};
测试代码:
void TestTQueueCSatck()
{
TQueueCSatck q;
q.Push(1);
q.Push(4);
q.Push(5);
q.Pop(); //_q2:1->4
q.Push(6);
q.Push(2); //_q2:1->4,_q1:6->2
q.Pop(); //_q1为空,_q2:1->4->6
q.Pop(); //_q1:1->4,_q2为空
q.Pop(); //_q1为空,_q2:1
q.Pop(); //_q1为空,_q2为空
q.Pop(); //assert
}
本人目前正处于学习之中,如果有考虑的不全面的地方或者错误,希望您能够指出和谅解,便于我们的共同学习和进步!
常见栈和队列面试题
1、实现一个栈,push,pop,求栈中最小元素,时间复杂度O(1)
2、使用两个栈实现一个队列
3、利用一个数组实现两个栈
4、元素出栈合法性