如何实现队列和栈的转化(c语言)

这篇具有很好参考价值的文章主要介绍了如何实现队列和栈的转化(c语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何实现队列和栈的转化(c语言),c语言,数据结构

文章目录

  • 一.什么是栈
  • 二.什么是队列
  • 三.怎么把栈变成队列(力扣)
  • 四.怎么把队列变成栈(力扣)
  • 总结

 

一.什么是栈

如何实现队列和栈的转化(c语言),c语言,数据结构

栈(stack)又名堆栈,它是一种运算受限的线性表。限定权在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

其实只要注意栈的一个特点就是后进先出

如何实现队列和栈的转化(c语言),c语言,数据结构

二.什么是队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

如何实现队列和栈的转化(c语言),c语言,数据结构

其实也是只有注意一点就是队列的特点就是先进先出

接下来我们只要是要解决队列是栈之间的转化,怎么把队列变成栈,怎么把栈变成队列

三.怎么把栈变成队列(力扣)

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to toppeek/pop from topsize, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

思路:设置两个站一个入数据,一个出数据,设置两个站一个入数据,一个出数据

如何实现队列和栈的转化(c语言),c语言,数据结构

3.1初始化

typedef struct {
	stack PushST;
	stack PopST;

} MyQueue;

3.2创建

开辟两个栈的空间

MyQueue* myQueueCreate() {
	MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));
	stackInit(&q->PushST);
	stackInit(&q->PopST);
	return p;
}

3.3插入 void push(int x) 将元素 x 推到队列的末尾

如果要插元素,就放入push这个栈里

void myQueuePush(MyQueue* obj, int x) {
	assert(obj);
	stack Push(&obj->PushST, x);
}

3.4删除  从队列的开头移除并返回元素

因为是队列,要满足先入先出,所以先判断Pop栈里还有没有数据,如果没有,就把push里的数据放过来,放一个就把Push栈里的数据删一个,然后在删Pop里的就可以了

int myQueuePop(MyQueue* obj) {
	if (stackEmpty(&obj->PopST))
	{
		while (!stackEmpty(&obj->PushST))
		{
			stackPush(&obj->PopST, stackTop(&obj->PushST));
			stackPop((&obj->PushST);
		}
		
	}
	int front = stackTop(&obj->PopST);
	stackPop(&obj->PopST);
	return front;
}

3.5去数据  返回队列开头的元素

和删除数据前面是一样的,但是这个不用删,所以结尾返回就可以了

int myQueuePeek(MyQueue* obj) {
	if (stackEmpty(&obj->PopST))
	{
		while (!stackEmpty(&obj->PushST))
		{
			stackPush(&obj->PopST, stackTop(&obj->PushST));
			stackPop((&obj->PushST);
		}

	}
	return stackTOP(&obj->PopST);

}

3.6检查数据和释放数据

bool myQueueEmpty(MyQueue* obj) {
	return stackEmpty(&obj->PushST) && stackEmpty(&obj->PopST);
}


void myQueueFree(MyQueue* obj) {
	stackDestroy(&obj->PushST);
	stackDestroy(&obj->PopST);
	free(obj);
}

四.怎么把队列变成栈(力扣)

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

 文章来源地址https://www.toymoban.com/news/detail-847102.html

注意:

  • 你只能使用队列的标准操作 —— 也就是 push to backpeek/pop from frontsize 和 is empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

核心思路:入数据时,往部位空的队列入保持另一个队列为空,出数据的时候,一次从对头的数据转移到另一个队列保存,只剩最后一个的时候pop掉
如何实现队列和栈的转化(c语言),c语言,数据结构

3.1初始化

typedef struct {
	Queue q1;
	Queue q2;

} MyStack;

3.2创建

开辟两个队列,用来实现栈结构

MyStack* myStackCreate() {
	MyStack* st = (MyStack*)malloc(sizeof(MyStack));
	QueueInit(st->q1);
	QueueInit(st->q2);
	return st;
}

3.3插入  void push(int x) 将元素 x 压入栈顶

入数据时,往部位空的队列入保持另一个队列为空,谁空就入谁

void myStackPush(MyStack* obj, int x) {
	if (!QueueEmpty(&obj->q1))
	{
		Queuepush(&obj->q1,x);
	}
	else
	{
		Queuepush(&obj->q2, x);
	}
}

3.4删除 移除并返回栈顶元素。

先判断那个队列是空的,然后把数据放到空的里,还剩一个的时候删除

int myStackPop(MyStack* obj) {
	//判断那个为空
	Queue* emptyQ = &obj->q1;
	Queue* noemptyQ = &obj->q2;
	if (!QueueEmpty(&obj->q1))
	{
		emptyQ = &obj->q2;
		noemptyQ = &obj->q1;
	}
	while (Queuesize(noemptyQ > 1))
	{
		Queuepush(emptyQ, QueueFront(noemptyQ));
		Queuepop(noemptyQ);
	}
	//还剩最后一个
	Queuepop(noemptyQ);
	int top = QueueFront(noemptyQ);
	return top;
}

3.5取头顶数据 返回栈顶元素。

先判断那个是空,top就是非空的尾数据

int myStackTop(MyStack* obj) {
	if (!QueueEmpty(&obj->q1))
	{
		return QueueBack(&obj->q1);
	}
	else
	{
		return QueueBack(&obj->q2);
	}
}

3.6检查数据和释放数据

bool myStackEmpty(MyStack* obj) {
	return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}

void myStackFree(MyStack* obj) {
	QueueDestroy(&obj->q1);
	QueueDestroy(&obj->q2);
	free(obj);
}

总结

队列与栈是重要的顺序结构,看懂这个转化之前先要学习栈与队列的基本构建

 

到了这里,关于如何实现队列和栈的转化(c语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 用唐都实验箱通过微指令实现冒泡排序,原码一位乘和栈的相关操作

    摘要 1 前言 2 实验原理 2.1 数据格式 2.2 指令格式 2.3 数据通路框图 3 总体****设计 3.1 微指令流程图 3.2 指令系统 3.3 线路连接图 4 详细设****计 4.1 冒泡排序 4.2 原码一位乘 4.3 堆栈 5 实验结果 5.1 冒泡排序 5.2 原码一位乘 5.3堆栈 6 参考文献 摘要 本次课程设计首先对复杂模型机进

    2024年02月03日
    浏览(54)
  • 『初阶数据结构 • C语言』⑩ - 栈的概念与实现(附完整源码)

        栈存储数据的方式跟数组一样,都是将元素排成一行。只不过它还有以下 3 条约束。   ● 只能在末尾插入数据。   ● 只能读取末尾的数据。   ● 只能移除末尾的数据。 你可以将栈看成一叠碟子:你只能看到最顶端那只碟子的碟面,其他都看不到。另外,要加碟子只能

    2024年02月16日
    浏览(51)
  • 【数据结构】栈的远房亲戚——队列

    大家好,很高兴又和大家见面啦!!! 在经过前面内容的介绍,我们已经知道了什么是栈,以及栈的一些基本操作。在介绍完如何通过C语言实现顺序栈之后,我们又详细介绍了顺序栈中的共享栈以及链栈的C语言实现,相信大家现在对栈已经有了一定的理解了。今天我们将来

    2024年01月20日
    浏览(38)
  • 头歌(C语言)-数据结构与算法-栈的实现-第1关:实现一个顺序存储的栈

    任务描述 相关知识 栈的基本概念 栈结构的定义(C) 顺序栈的操作 编程要求 测试说明 任务描述 本关任务是实现 step1/SeqStack.cpp 中的 SS_IsFull 、 SS_IsEmpty 、 SS_Length 、 SS_Push 和 SS_Pop 五个操作函数,以实现判断栈是否为满、是否为空、求栈元素个数、进栈和出栈等功能。 相关

    2024年02月07日
    浏览(65)
  • 面试题:堆和栈的区别

    1.管理方式不同。栈由操作系统自动分配释放,无需我们手动控制;堆的申请和释放由程序员控制,容易产生内存泄漏。 2.空间大小不同。每个进程拥有的栈大小要远远小于堆的大小。理论上进程可申请的堆大小为虚拟内存大小,进程栈的大小64bits的Windows默认1MB,64bits的Lin

    2023年04月09日
    浏览(41)
  • 【数据结构】栈和队列(栈的基本操作和基础知识)

    🌈个人主页: 秦jh__ https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏: 《数据结构》 https://blog.csdn.net/qinjh_/category_12536791.html?spm=1001.2014.3001.5482 目录  前言 栈 栈的概念和结构 栈的实现 ​编辑 数组栈的实现 总的声明 初始化  插入 删除 取栈顶元素 销毁 判断是否为空

    2024年02月03日
    浏览(54)
  • 【汇编】 13.3 对int iret和栈的深入理解

    可能还可以优化,这代码看着有点多。 同上。

    2024年01月23日
    浏览(57)
  • 数据结构 队列(C语言实现)

            任其事必图其效;欲责其效,必尽其方。——欧阳修;本篇文章主要写的是什么是队列、以及队列是由什么组成的和这些组成接口的代码实现过程。( 大多细节的实现过程以注释的方式展示请注意查看 )    话不多说安全带系好,发车啦 (建议电脑观看) 。 附

    2024年02月11日
    浏览(54)
  • 队列--C语言实现数据结构

    本期带大家一起用C语言实现队列🌈🌈🌈 队列是一种线性数据结构,它按照先进先出(FIFO)的原则进行操作。可以把队列想象成排队买票或者排队上公交车的队伍。 顺序队列 由一个连续的内存区域组成,可以存储多个元素。队列有两个指针,分别指向队头(Front)和队尾(

    2024年02月16日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包