习题---利用两个栈实现队列的“入队”和“出队”

这篇具有很好参考价值的文章主要介绍了习题---利用两个栈实现队列的“入队”和“出队”。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

利用两个栈进行实现队列的入队和出队操作

题目:

习题---利用两个栈实现队列的“入队”和“出队”

解题分析:

​ 该题目需要借助两个栈来实现队列的“入队”和“出队”,并封装好了三个对应的函数。我们需要注意的是栈的特点是“先进后出",与队列的”先进先出“的输出并不一致。所以,我们要利用栈来输出正常排序的序列,需要借助类似取反的原理,例如 !false == true,而 !(!false) == false。

​ 即我们需要现将元素存入栈s1,在对其执行出栈操作,此时我们得到元素的排列顺序与初始相反。此时我们在将该元素序列存入栈s2,再次取出便能得到“先进先出”排列顺序的元素。

​ 可是要完成该“入队”操作,我们必须对当前两个栈的状态进行判断,因为两个栈的存储状态会影响到元素的排列顺序与输出顺序。大致可以将两个栈的存储状态分为三类:

  1. s1满,s2空:将s1中的元素依次出栈,在依次入栈s2。此时,s1空,在将需要“入队”的元素入栈s1,便可以得到“先进先出”顺序的元素序列

  2. s1不满,s2空:同样将s1存有的元素依次次出栈,在依次入栈s2,这样的做法可以保证s1中已经存储的元素,可以在s2中按正确的顺序排列,并且不会影响到新“入队”的元素

  3. s1满,s2不空:此时无法进行入队操作

    从上面的分析情况可得,当s1中存在元素时,s2必须为空,否则无法执行“入队”操作。

    原因分析:当s2不空的时候,s2中的元素是按“先进先出”的顺序进行排列的,此时若是将s1中的元素依次出栈,再依次入栈到s2中的话,会导致无法实现“先进先出”特点的输出。例如:

    我们想要输出a b c d e f的队列;

    此时 s2中存储的是 a b c ,其中a为栈顶 ,且符合不空的情况;

    s1按 e d c 存储,且e为栈顶,且符合不满的情况;

    则此时对s1依次出栈,再依次出栈至s2的操作后;

    s2的存储情况变更为: d e f a b c 如下图所示:

习题---利用两个栈实现队列的“入队”和“出队”

此时我们可以看出,s1中的元素排列顺序是正确的,s2中原本的元素排列顺序也是正确的。但是,此时对s2执行“出队”的操作后,我们得到的队列就是错的。所以我们需要再执行“入队”的操作前,保证s2是为空的状态文章来源地址https://www.toymoban.com/news/detail-859228.html

代码实现:

  • “入队”算法
//入队
bool enQueue(s1,s2,int x)
{
	int temp; //用于存储出栈的元素的值

	//1.判断栈s1是否已满,此时分为两种情况(满了 or 未满)
	if (s1->top + 1 >= maxSize)
	{
		//说明栈s1已满,此时分为两种情况(栈s2空 or 栈s2不空)
		if ( isEmpty(s2) )
		{
			//此时栈s2为空,所以需要把栈s1的元素依次出栈到s2中
			while( ! isEmpty(s1) )
			{
				pop(s1,&temp); //把出栈元素暂时存储在temp中
				push(s2,temp); //把变量temp中的元素入栈到s2
			}

			push(s1,x); //此时栈s1为空,所以可以把元素x入栈到s1
			return true;
		}
		else
		{
			//此时栈s2不空,所以无法入队
			return false;
		}
	}
	else
	{
		//此时栈s1未满,所以可以把元素x入栈到s1中
		push(s1,x); 
	}

	return true;
}
  • "出队"算法
//出队

bool enQueue(s1,s2,&x)
{
	int temp; //为了存储出栈的元素

	//1.判断队列是否为空,此时分为两种情况(空 or 不空)
	if (isQueueEmpty(s1,s2))
	{
		return false;
	}
	else
	{
		//说明队列不空,此时又分为两种情况(栈s2空 or 栈s2不空)
		if ( !isEmpty(s2) )
		{
			//说明栈s2不空,则直接把元素出栈
			pop(s2,&x);
		}
		else
		{
			//说明栈s2为空,此时需要把栈s1的元素依次出栈到s2中
			while( ! isEmpty(s1) )
			{
				pop(s1,&temp); //把出栈元素暂时存储在temp中
				push(s2,temp); //把变量temp中的元素入栈到s2
			}

			pop(s2,&x);
		}
	}

	return true;
}
  • "判断队列为空"算法
//判断队列为空
int isQueueEmpty(s1,s2)
{
	if (isEmpty(s1) && isEmpty(s2))
	{
		return 1;
	}
	else
		return 0;
}

到了这里,关于习题---利用两个栈实现队列的“入队”和“出队”的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构经典题目】—两个队列实现栈与两个栈实现队列

    ​                                           食用指南:本文在有C基础的情况下食用更佳                                            🔥 这就不得不推荐此专栏了: C语言                                         🍀

    2024年02月13日
    浏览(45)
  • (力扣)用两个栈实现队列

     这里是栈的源代码:栈和队列的实现 当然,自己也可以写一个栈来用,对题目来说不影响,只要符合栈的特点就行。 题目: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作( push 、 pop 、 peek 、 empty ): 实现  MyQueue  类: void push(int x)  将元

    2024年02月13日
    浏览(25)
  • 【栈和队列】剑指 Offer 09. 用两个栈实现队列

    用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1: 输入: [“CQueue”,“appendTail”,“deleteHead”,“deleteHead”,“deleteHead”] [[]

    2024年02月01日
    浏览(37)
  • Java面试之用两个栈实现队列

    用两个栈实现一个队列,实现在队列尾部插入节点和在队列头部删除节点的功能。 队列是一种特殊的线性表,它只允许在表的前端(队头)进行删除操作,在表的后端(队尾)进行插入。 故队列又称为先进先出(FIFO—first in first out)线性表。 栈作为一种数据结构,是一种只

    2024年02月11日
    浏览(32)
  • Week1:用两个栈实现队列

    用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1: 示例 2: 示例的含义: 第一行可以理解为对队列的操作,共有三种 ①CQue

    2024年02月10日
    浏览(38)
  • 剑指 Offer 09. 用两个栈实现队列

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸剑指 Offer  🛹Linux 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸

    2024年02月08日
    浏览(33)
  • 每日一题之用两个栈实现队列

    题目:用两个栈实现队列 用两个栈来实现一个队列,使用 n 个元素来完成 n 次在队列尾部插入整数( push )和 n 次在队列头部删除整数( pop )的功能。队列中的元素为 int 类型。保证操作合法,即保证pop操作时队列内已有元素。 参考牛客的解题思路: 将 stack1 倒序写入 stack2 ,然

    2024年02月13日
    浏览(38)
  • (力扣)用两个队列实现栈---C语言

    分享一首歌曲吧,希望在枯燥的刷题生活中带给你希望和勇气,加油!    题目: 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作( push 、 top 、 pop  和  empty )。 实现  MyStack  类: void push(int x)  将元素 x 压入栈顶。 int pop()  移除并返回

    2024年02月14日
    浏览(27)
  • 【数据结构】栈和队列的模拟实现(两个方式实现)

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖        这一篇博客将学习栈和队列的相关知识, 栈

    2024年02月05日
    浏览(44)
  • (栈队列堆) 剑指 Offer 09. 用两个栈实现队列 ——【Leetcode每日一题】

    难度:简单 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素, deleteHead 操作返回 -1 ) 示例 1: 输入: [“CQueue”,“appendTail”,“deleteHead”,“deleteHead”,“d

    2024年02月17日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包