用队列实现栈。
方法一:用两个队列实现栈:
两个队列,一个用于存数据,一个用于中转,使用不固定。同一时刻两个队列不可能同时有数据。实现栈的操作就是将数在这两个队列中不断转移。
入栈:选择不为空的队列加入数据,如果都为空,则加入队列2.
出栈时:将不为空的队列的数据依次加入另一个队列中直至队列只剩下一个数,将该数弹出。
返回栈首:将不为空的队列的数依次加入得到另一个队列,直至只剩下一个数,将该数赋值给top,后将该数加入另一个队列。
实现代码:
class MyStack
{
public:
void push(int val);
void pop();
int top();
bool empty();
private:
queue<int> q1;
queue<int> q2;
};
void MyStack::push(int val)
{
if (!q1.empty())
q1.push(val);
else
q2.push(val);
}
void MyStack::pop()
{
assert(!q1.empty() || !q2.empty());
if (!q1.empty())
{
while (q1.size() > 1)
{
q2.push(q1.front());
q1.pop();
}
q1.pop();
}
else
{
while (q2.size() > 1)
{
q1.push(q2.front());
q2.pop();
}
q2.pop();
}
}
int MyStack::top()
{
assert(!q1.empty() || !q2.empty());
int top = 0;
if (!q1.empty())
{
while (q1.size()>1)
{
q2.push(q1.front());
q1.pop();
}
top = q1.front();
q2.push(q1.front());
q1.pop();
}
else{
while (q2.size() > 1)
{
q1.push(q2.front());
q2.pop();
}
top = q2.front();
q1.push(q2.front());
q2.pop();
}
return top;
}
bool MyStack::empty()
{
return q1.empty() && q2.empty();
}
方法二:用一个队列实现栈:
队列A,每次进栈都将元素加入到队列A,出栈时,将队列A的前size-1个元素,循环加入到A的尾,然后将位于A头的元素弹出。
以下是实现代码:
class MyStack
{
public:
void push(int val);
void pop();
int top();
bool empty();
private:
queue<int> q1;
};
void MyStack::push(int val)
{
q1.push(val);
}
void MyStack::pop()
{
assert(q1.size() >= 1);
int size = q1.size();
for (int i = 0; i < size-1; i++)
{
q1.push(q1.front());
q1.pop();
}
q1.pop();
}
int MyStack::top()
{
assert(q1.size() >= 1);
int size = q1.size();
for (int i = 0; i < size-1; i++)
{
q1.push(q1.front());
q1.pop();
}
int top = q1.front();
q1.push(q1.front());
q1.pop();
return top;
}
bool MyStack::empty()
{
return q1.empty();
}