方法一:用两个栈
1.1
入队时间复杂度:O(1)
出队时间复杂度:O(n)
class MyQueue
{
private:
stack<int> s1;
stack<int> s2;
int front; //用来记录“队首”元素
public:
MyQueue() {}
void push(int x)
{
if (s1.empty() == true)
{
front = x;
}
s1.push(x);
}
int pop()
{
while (s1.empty() == false)
{
s2.push(s1.top());
s1.pop();
}
int temp = s2.top();
s2.pop();
if (s2.empty() == false)
{
front = s2.top();
}
while (s2.empty() == false)
{
s1.push(s2.top());
s2.pop();
}
return temp;
}
int peek()
{
return front;
}
bool empty()
{
return s1.empty();
}
};
1.2
与1.1正好相反
入队时间复杂度:O(n)
出队时间复杂度:O(1)
class MyQueue
{
private:
stack<int> s1;
stack<int> s2;
int front;
public:
MyQueue() {}
void push(int x) //时间复杂度:O(n)
{ //空间复杂度:O(n)
if (s1.empty() == true)
{
front = x;
}
while (s1.empty() == false)
{
s2.push(s1.top());
s1.pop();
}
s1.push(x);
while (s2.empty() == false)
{
s1.push(s2.top());
s2.pop();
}
}
int pop()
{
int temp = s1.top(); //时间复杂度:O(1)
//空间复杂度:O(1)
s1.pop();
if (s1.empty() == false)
{
front = s1.top();
}
return temp;
}
int peek()
{
return front;
}
bool empty()
{
return s1.empty();
}
};
方法二:
使用两个栈 入队 - O(1)出队 - 摊还复杂度 O(1)
class MyQueue
{
private:
stack<int> s1;
stack<int> s2;
int front;
public:
MyQueue() {}
void push(int x)
{
if (s1.empty() == true)
{
front = x;
}
s1.push(x);
}
int pop()
{
if (s2.empty() == true)
{
while (s1.empty() == false)
{
s2.push(s1.top());
s1.pop();
}
}
int temp = s2.top();
s2.pop();
return temp;
}
int peek()
{
if (s2.empty() == false)
{
return s2.top();
}
else
{
return front;
}
}
bool empty()
{
return s1.empty() && s2.empty();
}
};