【数据结构】利用两个栈来模拟一个队列

两个栈 分别为 S1,S2, 已知栈的4个运算定义如下:

Push(S,x); //元素x入栈S
Pop(S,x); //S出栈并将出栈元素赋给 x
StackEmpty(S); //判断栈是否空
StackOverFlow(S); //判断栈是否满

实现队列的3个运算:

  • 将元素 x 入队
bool Enqueue(Stack &S1, ElemType x){
	//如果栈S1未满,可直接入栈
	if(!StackOverFlow(S1)){
		Push(S,x);
		return true;
	}
	//判断是否队列满(栈S1满且栈S2不空)
	if(StackOverFlow(S1)&&!StackEmpty(S2)){
		return false;
	}
	//如果栈S2为空。则可以先将栈S1中的元素弹入栈S2中后,再入队
	if(StackOverFlow(S1)&&StackEmpty(S2)){
		while(!StackEmpty(S1)){
			Pop(S1,t);
			Push(S2,t);
		}
	}
	Push(S1,x);
	return true;
}
  • 出队,并将出队元素存储在 x 中
bool Dequeue(Stack &S1, Stack &S2, ElemType &x){
	//如果栈S2不为空,说明有调整好顺序的元素,直接弹出S2的栈顶元素
	if(!StackEmpty(S2)){
		Pop(S2,x);
		return true;
	}
	//判断栈S1是否为空,若S1和S2都为空即队列为空,返回false
	if(StackEmpty(S1)){
		return false;
	}
	//若栈S1不空,则按照FIFO的规则,利用栈S2调整顺序
	ElemType t;
	while(!StackEmpty(S1)){
		Pop(S1,t);
		if(StackOverFlow(S2)){
			return false;
		}
		Push(S2,t);
	}
	//弹出S2的栈顶元素,即为当前的队头元素
	Pop(S2,x);
	return true;
}
  • 判断队列是否为空
bool QueueEmpty(Stack &S1, Stack &S2){
	if(StackEmpty(S1)&&StackEmpty(S2)){
		return true;
	}
	else
		return false;
}
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值