两个栈模拟一个队列(Stacks Imitate Queue)

image

/***************************************************************************
  * @file name:		:StacksSimulateQueue
  * @brief  		:两个栈实现队列的功能
  * @author 		:wvjnuhhail@126.com
  * @date 			:2024/04/26
  * @version 1.0 	:V1.0
  * @property 		:None
  * @note   		:None
  * CopyRight (c)  2023-2024   wvjnuhhail@126.com   All Right Reseverd
*****************************************************************************/



//利用栈s1和s2实现队列,栈的思想是“后进先出”,队列的思想是“先进先出”,可以选择把栈s1作为入队缓存,把栈s2作为出队缓存

//入队
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;
}

//判断队列是否为空
int isQueueEmpty(s1,s2)
{
  if(isEmpty(s1) && isEmpty(s2))
  {
    return 1;
  }

  return 0;
}


//出队

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;
}
posted @ 2024-04-26 20:07  WJnuHhail  阅读(8)  评论(0编辑  收藏  举报