【算法集训】基础数据结构:六、栈和队列

做这几天的数据结构的题目的时候有很多函数需要填写,这里需要有一个大致的顺序,一般是先补全结构体,也就是创建队列 | 栈;
而后初始化,设置初值create()函数,再然后C语言需要释放,补全释放函数也就是free
这下可以根据题目要求进行操作了,一般情况下模拟操作自己是可以做出来的,但是像我第一次看到这个题目肯定是一脸懵逼,只有看了视频才知道。
数据结构我感觉就是孰能生巧的东西,不像算法变化很多,还是要多敲代码记住就可以了。

第一题 面试题 03.04. 化栈为队

第一种:这里初始化顶部为0,所以要访问顶部的话需要-1再进行访问。

// 题目要求两个栈,这里用数组创建两个栈
typedef struct {int stackin[30000], topin;int stackout[30000], topout;
} MyQueue;/** Initialize your data structure here. */
//创建"队列",初始化
MyQueue* myQueueCreate() {MyQueue * obj = (MyQueue *)malloc(sizeof(MyQueue));obj->topin = 0;obj->topout = 0;return obj;
}/** 往队列中加入元素. */
void myQueuePush(MyQueue* obj, int x) {obj->stackin[obj->topin++] = x;
}/** 移除队列的头部 */
int myQueuePop(MyQueue* obj) {if(obj->topout == 0) {while(obj->topin) {obj->stackout[obj->topout++] = obj->stackin[--obj->topin];}}return obj->stackout[--obj->topout];
}/** 获取队列的头部(不删除). */
int myQueuePeek(MyQueue* obj) {if(obj->topout == 0) {while(obj->topin) {obj->stackout[obj->topout++] = obj->stackin[--obj->topin];}}return obj->stackout[obj->topout - 1];
}/** 判断队列是否为空. */
bool myQueueEmpty(MyQueue* obj) {return obj->topin + obj->topout == 0;
}
// 释放队列
void myQueueFree(MyQueue* obj) {free(obj);
}/*** Your MyQueue struct will be instantiated and called as such:* MyQueue* obj = myQueueCreate();* myQueuePush(obj, x);* int param_2 = myQueuePop(obj);* int param_3 = myQueuePeek(obj);* bool param_4 = myQueueEmpty(obj);* myQueueFree(obj);
*/

第二种:这里初始化顶部为1

typedef struct {int stackin[30000], topin;int stackout[30000], topout;
} MyQueue;/** Initialize your data structure here. */MyQueue* myQueueCreate() {MyQueue * obj = (MyQueue *)malloc(sizeof(MyQueue));obj->topin = -1;obj->topout = -1;return obj;
}/** Push element x to the back of queue. */
void myQueuePush(MyQueue* obj, int x) {obj->stackin[++obj->topin] = x;
}/** Removes the element from in front of queue and returns that element. */
int myQueuePop(MyQueue* obj) {if(obj->topout == -1) {while(obj->topin != -1) {obj->stackout[++obj->topout] = obj->stackin[obj->topin--];}}return obj->stackout[obj->topout--];
}/** Get the front element. */
int myQueuePeek(MyQueue* obj) {if(obj->topout == -1) {while(obj->topin != -1) {obj->stackout[++obj->topout] = obj->stackin[obj->topin--];}}return obj->stackout[obj->topout];
}/** Returns whether the queue is empty. */
bool myQueueEmpty(MyQueue* obj) {return obj->topin + obj->topout == -2;
}void myQueueFree(MyQueue* obj) {free(obj);
}/*** Your MyQueue struct will be instantiated and called as such:* MyQueue* obj = myQueueCreate();* myQueuePush(obj, x);* int param_2 = myQueuePop(obj);* int param_3 = myQueuePeek(obj);* bool param_4 = myQueueEmpty(obj);* myQueueFree(obj);
*/

第二题 LCR 125. 图书整理 II

这里删除图书那里,和上一题不一样,上一题保证没有空的,但这一题是有空的,这里需要进行一个判断,如果两个栈都为空则返回-1

typedef struct {int stackin[10001], topin;int stackout[10001], topout;
} CQueue;CQueue* cQueueCreate() {CQueue * obj = (CQueue *)malloc(sizeof(CQueue));obj->topin = 0;obj->topout = 0;return obj;
}void cQueueAppendTail(CQueue* obj, int value) {obj->stackin[obj->topin++] = value;
}int cQueueDeleteHead(CQueue* obj) {if(obj->topout == 0) {while(obj->topin) {obj->stackout[obj->topout++] = obj->stackin[--obj->topin];}}if(obj->topout == 0) {return -1;}else {return obj->stackout[--obj->topout];}}void cQueueFree(CQueue* obj) {free(obj);
}/*** Your CQueue struct will be instantiated and called as such:* CQueue* obj = cQueueCreate();* cQueueAppendTail(obj, value);* int param_2 = cQueueDeleteHead(obj);* cQueueFree(obj);
*/

第三题 232. 用栈实现队列

typedef struct {int stackin[101], topin;int stackout[101], topout;
} MyQueue;MyQueue* myQueueCreate() {MyQueue * obj = (MyQueue *)malloc(sizeof(MyQueue));obj->topin = -1;obj->topout = -1;return obj;
}void myQueuePush(MyQueue* obj, int x) {obj->stackin[++obj->topin] = x;
}int myQueuePop(MyQueue* obj) {if(obj->topout == -1) {while(obj->topin != -1) {obj->stackout[++obj->topout] = obj->stackin[obj->topin--];}}return obj->stackout[obj->topout--];
}int myQueuePeek(MyQueue* obj) {if(obj->topout == -1) {while(obj->topin != -1) {obj->stackout[++obj->topout] = obj->stackin[obj->topin--];}}return obj->stackout[obj->topout];
}bool myQueueEmpty(MyQueue* obj) {return obj->topin + obj->topout == -2;
}void myQueueFree(MyQueue* obj) {free(obj);
}/*** Your MyQueue struct will be instantiated and called as such:* MyQueue* obj = myQueueCreate();* myQueuePush(obj, x);* int param_2 = myQueuePop(obj);* int param_3 = myQueuePeek(obj);* bool param_4 = myQueueEmpty(obj);* myQueueFree(obj);
*/

第四题 225. 用队列实现栈

// 创建队列
typedef struct {int head;int tail;int data[100001];
} MyQueue;void myQueueInit(MyQueue * obj) {obj->head = 0;obj->tail = -1;
}void myQueuePush(MyQueue * obj, int x) {obj->data[++obj->tail] = x;
}int myQueuePop(MyQueue * obj) {return obj->data[obj->head++];
}int myQueueTop(MyQueue * obj) {return obj->data[obj->head];
}int myQueueSize(MyQueue * obj) {return obj->tail - obj->head + 1;
}typedef struct {MyQueue q[2];int pushIdx;
} MyStack;MyStack* myStackCreate() {MyStack * obj = (MyStack *)malloc( sizeof(MyStack) );for(int i = 0; i < 2; i++) {myQueueInit( &obj->q[i]);}obj->pushIdx = 0;return obj;
}void myStackPush(MyStack* obj, int x) {MyQueue * q = &(obj->q[obj->pushIdx]);myQueuePush( q, x);
}int myStackPop(MyStack* obj) {MyQueue * pushq = &(obj->q[obj->pushIdx]);MyQueue * emptyq = &(obj->q[1 - obj->pushIdx]);while( myQueueSize(pushq) > 1 ) {myQueuePush(emptyq, myQueuePop(pushq));}int ret = myQueuePop(pushq);obj->pushIdx = 1 - obj->pushIdx;return ret;
}int myStackTop(MyStack* obj) {MyQueue * pushq = &(obj->q[obj->pushIdx]);MyQueue * emptyq = &(obj->q[1 - obj->pushIdx]);while( myQueueSize(pushq) > 1 ) {myQueuePush(emptyq, myQueuePop(pushq));}int ret = myQueuePop(pushq); myQueuePush(emptyq, ret);obj->pushIdx = 1 - obj->pushIdx;return ret;
}bool myStackEmpty(MyStack* obj) {return myQueueSize(&(obj->q[obj->pushIdx]))  == 0;
}void myStackFree(MyStack* obj) {free(obj);
}/*** Your MyStack struct will be instantiated and called as such:* MyStack* obj = myStackCreate();* myStackPush(obj, x);* int param_2 = myStackPop(obj);* int param_3 = myStackTop(obj);* bool param_4 = myStackEmpty(obj);* myStackFree(obj);
*/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见的响应状态码

状态码英文描述解释200OK客户端请求成功&#xff0c;即处理成功&#xff0c;这是我们最想看到的状态码302Found指示所请求的资源已移动到由Location响应头给定的 URL&#xff0c;浏览器会自动重新访问到这个页面304Not Modified告诉客户端&#xff0c;你请求的资源至上次取得后…

【MyBatis】拦截查询结果同时动态替换

说明 项目中需要用到响应时替换某些字段的某些值。 代码 package xxx.xxx.xx;import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.cache.CacheKey; import org.apach…

智能优化算法应用:基于蜻蜓算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜻蜓算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜻蜓算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜻蜓算法4.实验参数设定5.算法结果6.参考文献7.MA…

【音视频 | H.264】H.264编码详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

使用FluentAvalonia组件库快速完成Avalonia前端开发

前言 工欲善其事必先利其器,前面我们花了几篇文章介绍了Avalonia框架以及如何在Avalonia框架下面使用PrismAvalonia完成MVV模式的开发。今天我们将介绍一款重磅级的Avalonia前端组件库,里面封装了我们开发中常用的组件,这样就不用我们自己再写组件了。专注业务功能开发,提…

1.4 Postman的安装

hello大家好&#xff0c;本小节我们来安装一下Postman&#xff0c;好为我们后续的测试工作做准备。 首先&#xff0c;打开Postman的官网Postman API Platform 然后根据同学们自己电脑的操作系统来下载对应的Postman安装包。我这里拿windows来举例。我们点击windows的图标 会跳…

Qt 剪贴板操作

Qt剪贴板操作 剪贴板的操作经常和前面所说的拖放技术在一起使用,因此我们现在先来说说剪贴板的相关操作。大家对剪贴板都很熟悉。我们可以简单的把它理解成一个数据的存储池,可以把外面的数据放置进去,也可以把里面的数据取出来。剪贴板是由操作系统维护的,所以这提供了跨…

常见的计算机图片格式

左rgb &#xff08;光源色彩&#xff09; 右cmyk &#xff08;印刷色彩&#xff09; 缺点&#xff0c;不能保存&#xff0c;储存空间太大

我对前端/互联网发展的一些看法

写在前面 看这篇文章的标题你们估计也想到了,我就是单纯的水一篇文章,但是以我的尿性也不可能完全水,毕竟我是一个主打实际的博主,我还是希望通过文章输出一些我对技术或者是生活的一些看法,既然是看法,那么就肯定有很多人持有不同的看法,不过我欢迎任何不同的声音,毕竟我也已经…

螺旋矩阵算法(leetcode第54题)

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。示例 1&#xff1a;输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a;输入&#xff…

工厂设备维护管理有什么比较好的解决方案?有什么好用的工单管理系统?

生产设备对于工厂来说是十分宝贵的资产。一方面&#xff0c;工厂依赖设备进行生产活动&#xff0c;一旦设备故障就会影响产量&#xff1b;另一方面&#xff0c;工厂中的生产设备一般造价都比较高昂&#xff0c;如果出现故障就会增加工厂的生产成本&#xff1b;再一方面&#xf…

SQL Server 服务启动报错:错误1069:由于登录失败而无法启动服务

现象 服务器异常关机以后&#xff0c;SQL Server服务无法启动了。 启动服务时报错&#xff1a; 错误1069:由于登录失败而无法启动服务 解决办法 我的电脑–控制面板–管理工具–服务–右键MSSQLSERVER–属性–登录–登陆身份–选择"本地系统帐户" 设置完成后&am…

JavaSE基础50题:23. 数组拷贝(数组练习题)

文章目录 概述方法一&#xff1a;运用for循环进行拷贝方法二&#xff1a;Java内置方法进行拷贝方法三&#xff1a;指定区间进行拷贝方法四&#xff1a;数组克隆clone() 概述 数组拷贝。 注意&#xff1a; public static void main(String[] args) {int[] array1 {1,2,3,4};Sy…

Trace 在多线程异步体系下传递

JAVA 线程异步常见的实现方式有&#xff1a; new ThreadExecutorService 当然还有其他的&#xff0c;比如fork-join&#xff0c;这些下文会有提及&#xff0c;下面主要针对这两种场景结合 DDTrace 和 Springboot 下进行实践。 引入 DDTrace sdk <properties><java.…

docker容器日志占用磁盘空间过大问题

docker服务运行一段时间后&#xff0c;发现磁盘空间占用很高 其中磁盘占用主要以下目录&#xff1a; /var/lib/docker/containers # 查询占用磁盘较大的文件-升序 du -d1 -h /var/lib/docker/containers | sort -h 控制容器日志大小 法一&#xff1a;容器运行时控制 # max-…

CUDA锁页内存的使用

1.定义指针变量 float *host_Weights; // 锁页内存 float *dev_Weights; // 设备端内存2.分配内存 cudaHostAlloc((void**)&host_Weights, numInputs * sizeof(float), cudaHostAllocDefault); // 用锁页内存&#xff0c;可以有效加快数据传递速度 cudaMalloc((vo…

JavaEE进阶学习: SpringBoot 日志文件

1.日志有什么用 日志的主要作用是记录系统的运行状态、事件和错误信息等。具体来说&#xff0c;日志可以用于以下几个方面&#xff1a; 故障排除&#xff1a;当系统出现故障或错误时&#xff0c;日志可以帮助开发人员定位问题的具体原因和位置&#xff0c;从而更快地修复系统。…

Intellij IDEA 运行maven报错误“CreateProcess error=2, 系统找不到指定的文件“的完美解决方案

一、问题背景 博主正常使用着Intellij IDEA&#xff0c;不知道为什么突然Intellij IDEA报错&#xff0c;错误提示如下&#xff1a; Error:Cannot run program "C:\Program Files\Java\jdk1.8.0_351" 观察Intellij IDEA报错的原因&#xff0c;我们可以知道&#xff1…

【LeetCode刷题-栈】-- 150.逆波兰表达式求值

150.逆波兰表达式求值 方法&#xff1a;使用栈 class Solution {public int evalRPN(String[] tokens) {Stack<Integer> numStack new Stack<>();for(int i 0; i < tokens.length;i){String token tokens[i];if(isNumber(token)){numStack.push(Integer.par…

免费!简单优雅的手机视频制作PR模板抖音素材下载

这是一款多功能的Premiere Pro模板&#xff0c;无论你是为视频、宣传内容还是社交媒体帖子短视频&#xff0c;这个pr模板都会为你的项目增添一丝优雅和专业。适用于广播&#xff0c;俱乐部&#xff0c;音乐会&#xff0c;舞蹈&#xff0c;设计&#xff0c;宣传片&#xff0c;动…