C语言数据结构:利用两个顺序栈来实现一个列队的功能时遇到的问题
进在模拟进队操作时,当栈s1满,栈s2非空时,这时栈s1为何不能再执行进栈操作:我的想法是:此时可以先让栈s1出栈一部分元素,压入栈s2,然后栈s1不就能执行进栈操作了吗...
进在模拟进队操作时,当栈s1满,栈s2非空时,这时栈s1为何不能再执行进栈操作:我的想法是:此时可以先让栈s1出栈一部分元素,压入栈s2,然后栈s1不就能执行进栈操作了吗
展开
1个回答
展开全部
假设s1、s2的深度都是3
s1已满,从栈顶到栈低依次是:5、4、3
s2非空,从栈顶到栈底依次是:1、2
此时要想在入栈一个元素6的话,按照你的想法,
得把s1的数据出栈到一个缓冲区,然后把缓冲区中,在原来s1栈底的3挪动到s2的栈顶,
然后s1的4、5依次压回栈s1,然后s1就能够空出栈顶的一个位置了,对吧?
但是,这个放置s1出栈元素的缓冲区。。。也得是一个栈结构吧?否则的话,你怎么知道s1向缓冲区出栈的u元素 顺序呢?
这样就不是双栈模拟队列了,势必还得用到一个中间栈s3来满足你这种处理方式~
因此,双栈模拟队列时,当栈s1满,栈s2非空时,栈s1再执行进栈操作。因为双栈是没有s3的~
s1已满,从栈顶到栈低依次是:5、4、3
s2非空,从栈顶到栈底依次是:1、2
此时要想在入栈一个元素6的话,按照你的想法,
得把s1的数据出栈到一个缓冲区,然后把缓冲区中,在原来s1栈底的3挪动到s2的栈顶,
然后s1的4、5依次压回栈s1,然后s1就能够空出栈顶的一个位置了,对吧?
但是,这个放置s1出栈元素的缓冲区。。。也得是一个栈结构吧?否则的话,你怎么知道s1向缓冲区出栈的u元素 顺序呢?
这样就不是双栈模拟队列了,势必还得用到一个中间栈s3来满足你这种处理方式~
因此,双栈模拟队列时,当栈s1满,栈s2非空时,栈s1再执行进栈操作。因为双栈是没有s3的~
追问
我不是这个意思,我的意思是此时要想在入栈一个元素6的话,可以先将s1的5直接出栈压入s2,此时s1不就能执行入栈元素6的操作了吗?也没用到缓冲区呀?
追答
这时把5压到s2的话,入栈s6后,怎么取队列的首元素?队列的首元素,是从s2出栈得到的,这时s2的栈顶是5,但是实际上原本的队首应该是1啊~
所以直接把5出栈压到s2,会破坏队列顺序~
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询