栈实现队列:
思想:是有两个栈,一个用来放数据(数据栈),一个用来辅助(辅助栈)。数据添加时,会依次压人栈,取数据时肯定会取栈顶元素,但我们想模拟队列的先进先出,所以就得取栈底元素,那么辅助栈就派上用场了,把数据栈的元素依次弹出到辅助栈,但保留最后一个元素,最后数据栈就剩下了最后一个元素,直接把元素返回,这时数据栈已经没有了数据。最后呢,把辅助栈的元素依次压人数据栈,这样,我们成功取到了栈底元素。
代码如下:
class Queue
{
public:
void push(int data)//入栈时,无论两个栈是什么情况,都只往s1中入
{
s1.push(data);
}
int pop()
{
if(s1.empty() && s2.empty())
{
cout << "The queue is empty";
}
if (!s2.empty())
{
int val = s2.top();
s2.pop();
return val;
}
else
{
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
}
private:
stack<int> s1;
stack<int> s2;
};
队列实现栈:
思想:有数据队列和辅助队列,模拟栈的先进后出,队列是队尾进队头出,也就是说每次取值要取队列的队尾元素,数据队列出队到辅助队列,留下最后一个元素返回,辅助队列再把元素出队到数据队列
代码如下:
class stack
{
public:
void push(int data) //保证任何时候只有一个队列中有元素
{
if(q1.empty() && q2.empty())
{
q1.push(data);
}
if(q1.empty() && !q2.empty())
{
q2.push(data);
}
if(!q1.empty() && q2.empty())
{
q1.push(data);
}
}
int pop()
{
int val;
if(q1.size() != 0)//处理q1的元素
{
while(q1.size() > 1)//非空队列中除最后一个元素入另一个队,最后一个元素出队,相当于出栈
{
q2.push(q1.front());
q1.pop();
}
val = q1.front();
q1.pop();
}
else //处理q2的元素
{
while(q2.size() > 1)
{
q1.push(q2.front());
q2.pop();
}
val = q2.front();
q2.pop();
}
return val;
}
private:
queue<int> q1;
queue<int> q2;
};