用两个栈来模拟队列
来源:互联网 发布:佳明官网软件connect 编辑:程序博客网 时间:2024/05/19 18:37
问题:
请利用两个栈S1和S2来模拟一个队列。已知栈的三个运算定义如下:PUSH(ST,x):元素x入ST栈;POP(ST,x):ST栈顶元素出栈,赋给变量x;Sempty(ST):判ST栈是否为空。那么如何利用栈的运算来实现该队列的三个运算:enqueue:插入一个元素入队列; dequeue:删除一个元素出队列;queue_empty:判队列为空。
分析:
栈的特点是后进先出,队列的特点是先进先出。所以,用两个栈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中。
代码:
// s1是容量为n的栈,栈中元素类型是elemtp。本函数将x入栈,若入栈成功返回1,否则返回0。
int enqueue( stack s1, elemtp x )
...{
if( top1==n && !Sempty(s2) ) // top1是栈s1的栈顶指针,是全局变量
...{
// s1满、s2非空,这时s1不能再入栈
printf(“栈满”);
return(0);
}
if( top1==n && Sempty(s2) ) // 若s2为空,先将s1退栈,元素再压栈到s2
...{
while( !Sempty(s1) )
POP( s1, x );
PUSH( s2, x );
}
PUSH( s1, x ); // x入栈,实现了队列元素的入队
return(1);
}
// s2是输出栈,本函数将s2栈顶元素退栈,实现队列元素的出队
void dequeue( stack s2, stack s1 )
...{
if( !Sempty(s2) ) // 栈s2不空,则直接出队
...{
POP( s2, x );
printf( “出队元素为”, x );
}
else if( Sempty(s1) ) // 处理s2空栈。若输入栈也为空,则判定队空
...{
printf(“队列空”);
exit(0);
}
else // 先将栈s1倒入s2中,再作出队操作
...{
while( !Sempty(s1) )
...{
POP( s1, x );
PUSH( s2, x );
}
POP( s2, x ); // s2退栈相当队列出队
printf( “出队元素为”, x );
}
}
// 本函数判用栈s1和s2模拟的队列是否为空
int queue_empty()
...{
if( Sempty(s1) && Sempty(s2) ) // 队列空
return(1);
else
return(0); //队列不空。
}
int enqueue( stack s1, elemtp x )
...{
if( top1==n && !Sempty(s2) ) // top1是栈s1的栈顶指针,是全局变量
...{
// s1满、s2非空,这时s1不能再入栈
printf(“栈满”);
return(0);
}
if( top1==n && Sempty(s2) ) // 若s2为空,先将s1退栈,元素再压栈到s2
...{
while( !Sempty(s1) )
POP( s1, x );
PUSH( s2, x );
}
PUSH( s1, x ); // x入栈,实现了队列元素的入队
return(1);
}
// s2是输出栈,本函数将s2栈顶元素退栈,实现队列元素的出队
void dequeue( stack s2, stack s1 )
...{
if( !Sempty(s2) ) // 栈s2不空,则直接出队
...{
POP( s2, x );
printf( “出队元素为”, x );
}
else if( Sempty(s1) ) // 处理s2空栈。若输入栈也为空,则判定队空
...{
printf(“队列空”);
exit(0);
}
else // 先将栈s1倒入s2中,再作出队操作
...{
while( !Sempty(s1) )
...{
POP( s1, x );
PUSH( s2, x );
}
POP( s2, x ); // s2退栈相当队列出队
printf( “出队元素为”, x );
}
}
// 本函数判用栈s1和s2模拟的队列是否为空
int queue_empty()
...{
if( Sempty(s1) && Sempty(s2) ) // 队列空
return(1);
else
return(0); //队列不空。
}
- 用两个栈来模拟队列
- 两个栈来模拟队列
- 两个栈来模拟队列
- 数据结构 用两个栈来模拟一个队列
- 剑指offer05--用两个栈来模拟队列
- 【华为练习题】用两个栈来模拟队列(中级)
- 用两个栈模拟队列
- 用两个栈模拟队列
- 两个栈S1和S2来模拟一个队列
- 两个队列模拟栈
- 两个栈模拟队列
- 两个队列模拟栈
- 用两个栈模拟一个队列
- 用两个栈模拟一个队列
- 剑指off-用两个队列模拟栈
- 用两个队列模拟一个栈
- 用两个栈模拟队列操作
- 用两个栈模拟一个队列
- JOOMLA如何禁止用户注册
- 一流企业做标准
- 解决spring+struts 找不到Action问题
- web应用服务器Bea weblogic8.1 设置虚拟目录
- QT
- 用两个栈来模拟队列
- IIS无法启动问题的解决
- 软件技术人员如何升级
- 双链表翻转算法
- 在FlashCom中检测摄像头和麦克风
- 知识库与本体
- 第一次来,以后会经常来。
- jsf标签之sun实现
- 整理一下关于parseInt 和parseFloat的理解