【数据结构Note3】_栈和队列的相互转换

发布于:2022-12-27 ⋅ 阅读:(482) ⋅ 点赞:(0)

栈和队列的相互转换

  • 栈:压栈和出栈都是再栈顶进行,所以栈遵守先进后出FILO。
  • 队列:队头出队,队尾入队,队列遵守先进先出FIFO。

栈和队列的函数实现都相应的遵守本身数据结构的特点。

具体见(217条消息) C/C++【数据结构笔记】(栈和队列)_Answer-2296的博客-CSDN博客

所谓的栈和队列的相互转换就是,用栈的数据结构来实现队列数据的先进先出,用队列的数据结构来实现栈的先进后出。

用栈实现队列

qx2ygppc9j

  • **保证最先入栈的数据在栈顶,最后入栈的数据压在栈底。**这样出栈就能模拟队列先进先出了(改变进栈)

为了保证这样的数据存放方式,我们会用两个栈来模拟实现队列。新元素入栈前,先将栈中的所有的数据压入辅助栈,再将新元素压入栈底,再将辅助栈的所有数据压会原来的栈中(同样的方式进出栈两次,栈中数据先后顺序不变)

完整代码实现:(实现前先引入栈的源代码!)具体见前面提及的博客。

void ImitateQueuePush(Stack* ps, STDataType data)
{
	Stack assit;
	StackInit(&assit);
	STDataType temp;//临时存放数据
	while (!StackEmpty(ps))//压入辅助栈
	{
		temp = StackTop(ps);
		StackPop(ps);
		StackPush(&assit, temp);
	}
	StackPush(ps, data);//新元素压入栈底
	while (!StackEmpty(&assit))//压回原栈
	{
		temp = StackTop(&assit);
		StackPop(&assit);
		StackPush(ps, temp);
	}
	StackDestory(&assit);
}

具体测试:

image-20220902222029198

用队列实现栈

r48p5r9xu8

  • 出队前将队尾前所有的结点逐个出队并入队,这样最终队尾元素就到了队头,这时出队的结点就是最后入队的结点,成功模拟栈的先进后出。(改变获取队头的方式)

完整代码实现:(实现前先引入队列的源代码!)

QDataType ImitateStackFront(Queue* qp)
{
	assert(qp);//判断是否是空指针
	assert(qp->tail);//判断是否是空队列
	QueueNode* last = qp->tail;//记录下最后一个结点
	QDataType temp;//临时存储结点
	do
	{
		temp = qp->head->data;
		QueuePop(qp);
		QueuePush(qp, temp);
	} while (qp->head != last);
	return qp->head->data;
}

具体测试:

image-20220902231739052


网站公告

今日签到

点亮在社区的每一天
去签到