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

文章目录

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

一.什么是栈

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

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

二.什么是队列

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

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

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

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

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(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(双端队列)来模拟一个栈,只要是标准的栈操作即可。

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

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 。

注意:

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

核心思路:入数据时,往部位空的队列入保持另一个队列为空,出数据的时候,一次从对头的数据转移到另一个队列保存,只剩最后一个的时候pop掉

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);
}

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2871493.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Git——本地使用详解

目录 Git1、开始版本控制1.1、初始化Repository1.2、使目录脱离Git控制 2、把文件交给Git管控2.1、创建文件后交给Git2.2、git add之后再次修改文件2.3、git add "--all"与"."参数区别2.4、把暂存区的内容提交到存储库里存档 3、工作区、暂存区与存储库3.1…

生成式AI竞赛:开源还是闭源,谁将主宰未来?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

C语言基础-内联函数在头文件中的定义

文章目录 前言inline关键字优点缺点使用注意 头文件中定义函数内联函数在头文件中的定义总结 前言 在软件开发过程中,大家可能很少会遇到inline关键字,也可能很少见到头文件中定义函数体。没有用过不代表不能了解,菜就多练!哈哈哈…

从零开始搭建游戏服务器 第三节 Protobuf的引入并使用

目录 上一节问题答案公布本节内容Protobuf介绍正文在build.gradle引入protobuf编写proto并生成使用生成的proto来进行数据传输 总结 上一节问题答案公布 上一节我们创建了ConnectActor,并且使用ConnectActorManager和connectId将其管理起来。 并且我们在收到客户端…

【Twinmotion】Twinmotion导入UE5

步骤 1. 在虚幻商城中安装“Datasmith Twinmotion导入器插件” 安装“面向虚幻引擎的Twinmotion内容” 2. 打开虚幻引擎,在插件中搜索“twinmotion”,勾选如下两个插件,然后重启虚幻引擎 3. 打开Twinmotion,随便添加一个物体 导出…

腾讯云2核2G免费服务器申请流程,2024免费服务器入口

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

4.1_5 文件存储空间管理

文章目录 4.1_5 文件存储空间管理(一)存储空间的划分与初始化(二)存储空间管理——空闲表法(三)存储空间管理——空闲链表法(1)空闲盘块链(2)空闲盘区链 &…

VScode----debug调试python代码添加上额外命令(args)

这里写目录标题 问题描述问题解决 更多内容可以点击这里查看个人博客:个人博客 问题描述 在服务器上运行python代码时,总会添加上额外的参数一般是用jyputer或者终端直接加上命令,现在我在vscode调试远程代码的时候想要加上这些命令. 问…

DFL《384底丹 430万》 wf/df-udt/448/96/96/32预训练模型

384底丹430万迭代:点击下载 训练素材19万张来自于以下数据集: 【更新】DST全角度训练图集V3.1 WF512【2.6W张 6GB 】【人脸混合_WF】FFHQ女性人脸数据,预训练炼丹专用【金鱼基础模型库】用于补全SRC极限角度香港中文大学CelebA预训练集-WF5…

HarmonyOS NEXT应用开发—状态栏显隐变化

介绍 本示例介绍使用Scroll组件的滚动事件 onScroll 实现状态栏显隐变化。该场景多用于各种软件的首页、我的等页面中。 效果预览图 使用说明 加载完成后显示状态栏显隐变化页面,上下拖动屏幕,顶端状态栏出现显隐变化。 实现思路 在置顶位置使用sta…

Vue-router3.0版本跳转报错

1.路由创建之后发现控制台push路由跳转报错了 2.解决方法: //在router文件中添加 const originalPush VueRouter.prototype.push VueRouter.prototype.push function push(location) {return originalPush.call(this, location).catch(err > err) }3.解决了

webpack5零基础入门-10babel的使用

Babel JavaScript 编译器。 主要用于将 ES6 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中 1.安装相关包 npm install -D babel-loader babel/core babel/preset-env 2.进行相关配置 2.1第一种写法是在webp…

Day67:WEB攻防-Java安全JNDIRMILDAP五大不安全组件RCE执行不出网

知识点: 1、Java安全-RCE执行-5大类函数调用 2、Java安全-JNDI注入-RMI&LDAP&高版本 3、Java安全-不安全组件-Shiro&FastJson&JackJson&XStream&Log4j Java安全-RCE执行-5大类函数调用 Java中代码执行的类: GroovyRuntimeExecPr…

git如何回退版本reset和revert命令的区别

文章目录 git回退版本的方法使用reset回退使用revert回退 总结 git回退版本的方法 Git回退到某个版本有两种方法&#xff1a;reset和revert。 使用reset回退 git reset --hard <版本号>该命令将HEAD指针移动到指定的版本&#xff0c;并重置工作目录和暂存区的内容。这…

微信小程序Skyline模式自定义tab组件胶囊与原生胶囊平齐,安卓和ios均自适应

进入下面小程序可以体验效果&#xff1a; 至于原理的话&#xff0c;解释起来毕竟麻烦&#xff0c;各位可以看源码自己分析。其实很简单&#xff0c;就算计算布局。很多网上公布的布局&#xff0c;都不能正常自适应。在下这个是完美可以的 1、WXML <view class"weui…

【遍历方法】浅析Java中字符串、数组、集合的遍历

目录 前言 字符串篇 1.1 使用 for 循环和 charAt 方法 1.2 使用增强 for 循环&#xff08;forEach 循环&#xff09; 1.3 使用 Java 8 的 Stream API 最终效果 数组篇 2.1 使用普通 for 循环 2.2 使用增强型 for 循环( forEach 循环) 2.3 使用 Arrays.asList 和 forE…

Python之Web开发中级教程----配置数据库

Python之Web开发中级教程----配置数据库 在settings.py中保存了数据库的连接配置信息&#xff0c;Django默认初始配置使用sqlite数据库。 DATABASES { default: { ENGINE: django.db.backends.sqlite3, NAME: os.path.join(BASE_DIR, db.sqlite3), } } 如果需要用MySQL数据…

LeetCode 0310.最小高度树:拓扑排序秒了

【LetMeFly】310.最小高度树&#xff1a;拓扑排序秒了 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-height-trees/ 树是一个无向图&#xff0c;其中任何两个顶点只通过一条路径连接。 换句话说&#xff0c;一个任何没有简单环路的连通图都是一棵树。 给你…

nginx做静态代理方式

改配置文件 server {listen 8899;server_name localhost;location / {root html;index index.html index.htm;} } 生成页面代码 例子 GetMapping("createIndex")public Result createIndex() {//获取后台存储数据Result result productFeignClient.getB…

python之万花尺

1、使用模块 import sys, random, argparse import numpy as np import math import turtle import random from PIL import Image from datetime import datetime from math import gcd 依次使用pip下载即可 2、代码 import sys, random, argparse import numpy as np imp…