两个堆栈一个队列

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

<转载>用两个堆栈实现一个队列

栈的特点是后进先出,队列的特点是先进先出。所以,用两个栈s1和s2模拟一个队列时,s1作输入栈,逐个元素压栈,以此模拟队列元素的入队。当需要出队

时,将栈s1退栈并逐个压入栈s2中,s1中最先入栈的元素,在s2中处于栈顶。s2退栈,相当于队列的出队,实现了先进先出。显然,只有栈s2为空且

s1也为空,才算是队列空。

[算法讨论]算法中假定栈s1和栈s2容量相同。出队从栈s2出,当s2为空时,若s1不空,则将s1倒入s2再出栈。入队在s1,当s1满后,若s2

空,则将s1倒入s2,之后再入队。因此队列的容量为两栈容量之和。元素从栈s1倒入s2,必须在s2空的情况下才能进行,即在要求出队操作时,若s2

空,则不论s1元素多少(只要不空),就要全部倒入s2中。

下面两个方法的思路是一致的,只是一个是基于进栈与队列相同一个基于出栈与队列相同。

法(1)

view sourceprint?

01int enqueue(stack s1,elemtp x)

02//s1是容量为n的栈,栈中元素类型是elemtp。本算法将x入栈,若入栈成功返回1,否则返回0。

03{if(top1==n && !Sempty(s2)) //top1是栈s1的栈顶指针,是全局变量。

04{printf(“栈满”);return(0);} //s1满s2非空,这时s1不能再入栈。

05if(top1==n && Sempty(s2)) //若s2为空,先将s1退栈,元素再压栈到s2。

06 {while(!Sempty(s1)) {POP(s1,x);PUSH(s2,x);}

07PUSH(s1,x); return(1); //x入栈,实现了队列元素的入队。

08}

09void dequeue(stack s2,s1)

10//s2是输出栈,本算法将s2栈顶元素退栈,实现队列元素的出队。11{if(!Sempty(s2)) //栈s2不空,则直接出队。

12{POP(s2,x); printf(“出队元素为”,x); }

13else//处理s2空栈。

14

if(Sempty(s1)) {printf(“队列空”);exit(0);}//若输入栈也为空,则判定队空。

15 else//先将栈s1倒入s2中,再作出队操作。

16 {while(!Sempty(s1)) {POP(s1,x);PUSH(s2,x);}

17 POP(s2,x); //s2退栈相当队列出队。

18 printf(“出队元素”,x);

19 }

20}//结束算法dequue。

21int queue_empty()

22//本算法判用栈s1和s2模拟的队列是否为空。

23{if(Sempty(s1)&&Sempty(s2)) return(1);//队列空。24else return(0); //队列不空。25}

法二:

view sourceprint?

01ElementType DeQueue(S1)

02{

03if(Empty(S1)

04{

05printf("Error!");

06exit(0);

07}

08else

09return Pop(S1);

10}

11void EnQueue(S1,ElementType x)

12{

13ElementType t;

14while(!Empty(S1))

15{

16t=Pop(S1);

17Push(S2,t;

18}

19Push(S1,x);

20while(!Empty(S2))

21{

22t=Pop(S2);

23Push(S1,t);

相关文档
最新文档