两个栈实现一个队列
看了各路大神的思路,我就综合了一下,写出了自己的一些理解,希望大家能指出我的不足。
栈s1实现主要实现“入队”操作;
栈s2实现主要实现”出队“操作;
思路一:
入队时:判s1是否为空,若为空,把s2里边的的元素“全部”倒回s1里边;若s1不为空,则直接将元素入栈s1;
出队时: 判s2是否为空,若为空(假设此时s1不为空,若s1也为空,就只能报错),把s1里边元素”全部“弹出到s2里边,然后执行出队操作;若s2不为空,则直接出队s2。
思路二:
入队时:直接将s1入队。
出队时:判s2是否为空,若为空(假设此时s1不为空,若s1也为空,就只能报错),把s1里边元素”全部“弹出到s2里边,然后执行出队操作;若s2不为空,则直接出队s2。
两个思路有一个可以共同优化的一项是:若s2出队时为空,将s1的元素弹出到s2里边的时候,只需弹出(总数-1)个,最后一个元素弹出后直接当作出队操作即可。
伪代码如下:
//入队操作;
void EnterQueue(s1,s2,k)
{
if(IsEmpty(s1)==1)
{
while(IsEmpty(s2)==0)
{
Push(s1,Pop(s2));
}
}
}
//出队操作:
void DelQueue(s1,s2,k)
{
if(IsEmpty(s2)==1)
{
if(IsEmpty(s1)==1)
{
exit(-1);
}
while(IsEmpty(s1)==0)
{
Push(s2,Pop(s1));
}
}
Pop(s2);
}
两个队列实现一个栈:
q1:实现 出栈 操作;q2:实现中转
出栈:先把入对k1,k2,k3入队q1,现在如果要出队,则依次把k1,k2,依次出队q1,然后再入队q2,把k3给出队(出栈);
入栈:q1和q2的入队过程便是入栈的过程
大致代码思想:
//假设栈中有n个元素
void Pop(q1,k)
{
i=n;
while(i>1)
{
Enter(q2,DelQueue(q1,kn));
)
Del(q1,k);
}
void Push(q1,k)
{
Enter(q1,k);
}