两个队列实现栈、两个栈实现队列

两个栈实现一个队列


图片

看了各路大神的思路,我就综合了一下,写出了自己的一些理解,希望大家能指出我的不足。
栈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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值