利用两个栈S1,S2来模拟一个队列

利用两个栈S1,S2来模拟一个队列

一、【问题描述 】

利用两个栈S1,S2来模拟一个队列,已知栈的4个运算定义如下:
Push(S,x);//元素x入栈
Pop(S,x) ;//S出栈并将出栈的值赋给x
StackEmpty(S) ;//判断栈是否为空
StackOverflow(S) ;// 判断栈是否满
如何利用栈的运算来实现该队列的3个运算(形参根据要求自己设计)?
Enqueue ;//将元素x入队
Dequeue ;//出队,并将出队元素存储在x中
QueueEmpty;/ /判断队列是否为空

二、【问题解答】

分析:
利用两个栈s1和s2来模拟一个队列,当需要向队列中插入一个元素时
用S1来存放已输入的元素,即S1执行入队操作。当需要出队时,则队S2执行
出栈操作。必须先将S1中所有元素出栈并入栈到S2中,再在S2中出栈
即可实现出队操作,而在执行此操作之前必须判断S2是否为空,否则导致顺序混乱
当栈S1和S2都为空时队列为空。
即:
①对S2的出栈操作用作出队,若S2为空则先将S1中所有元素送入S2
②对S1的入栈操作用作入队,若S1满,必须先保证S2为空,才能将S1中
的元素全部插入S2中
(1)出队算法

//入队算法
int EnQ(Stack &S1,Stack &S2,Elemtype e){
	if(!StackOverflow(S1)){
		Push(S1,e);
		return 1;
	}
	if(StackOverflow(S1)&&!StackEmpty(S2)){
		printf("队列满");
		return 0;
	}
	if(StackOverflow(S1)&&StackEmpty(S2)){
		while(!StackEmpty(S1)){
			Pop(S1,x);
			Push(S2,x);
		}
		Push(S1,e);
		return 1;
	}
} 

(2)入队算法

//出队算法
void DeQueue(Stack &S1,Stack &S2,Elemtype &x){
	if(!StackEmpty(S2)){
		Pop(S2,x); 
	}
	else if(!StackEmpty(S1)){
		printf("队列为空");
	}
	else{
		while(!StackEmpty(S1)){
		Pop(S1,x);
		Push(S2,x); 
	}
	Pop(S2,x);
}
} 

(3)判断队列为空算法

int QueueEmpty(Stack S1,Stack S2){
	if(StackEmpty(S1)&&StackEmpty(S2)){
		return 1;
	}
	else return 0;
} 
  • 10
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值