题目
用两个栈实现队列。
解题思路
感觉有 O ( n ) O(n) O(n)的解法,但是想了好一会还是没想到,看了数据范围1e4,交了一发 O ( n 2 ) O(n^2) O(n2)的过了。
原思路就是简单的来回倒。
题解思路
维护两个栈,一个维护插入,一个维护删除。需要删除的时候可以把插入栈里的元素全部倒进删除栈里,注意只有删除栈为空了,才会倒,否则会破坏元素的顺序。很巧妙。
代码
class CQueue
{
stack<int> st1, st2;
public:
CQueue()
{
while (st1.size())
st1.pop();
while (st2.size())
st2.pop();
}
void appendTail(int value)
{
st1.push(value);
}
int deleteHead()
{
if (!st2.size()) //为空才会倒,才能保证顺序正确
while (st1.size())
{
st2.push(st1.top());
st1.pop();
}
if (!st2.size())
return -1;
int res = st2.top();
st2.pop();
return res;
}
};