每日一练——用队列实现栈

225. 用队列实现栈 - 力扣(LeetCode)

Queue.h

#pragma once
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int QDataType;typedef struct QNode
{QDataType data;struct QNode* next;
} QNode;typedef struct Queue
{QNode* head;QNode* tail;int size;
} Queue;Queue* QueueCreate();
void QueueDestroy(Queue* q);void QueuePush(Queue* q, QDataType x);
QDataType QueuePop(Queue* q);QDataType QueueFront(Queue* q);
QDataType QueueBack(Queue* q);int QueueSize(Queue* q);
bool QueueEmpty(Queue* q);

Queue.c

#include"Queue.h"Queue* QueueCreate()
{Queue* q = (Queue*)malloc(sizeof(Queue));if (NULL == q){perror("malloc failed");exit(-1);}q->head = q->tail = NULL;q->size = 0;return q;
}void QueueDestroy(Queue* q)
{assert(q);while (!QueueEmpty(q))QueuePop(q);free(q);
}void QueuePush(Queue* q, QDataType x)
{assert(q);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (NULL == newnode){perror("malloc failed");exit(-1);}newnode->data = x;newnode->next = NULL;if (QueueEmpty(q))q->head = q->tail = newnode;else{q->tail->next = newnode;q->tail = newnode;}++(q->size);
}QDataType QueuePop(Queue* q)
{assert(q);assert(!QueueEmpty(q));QDataType ret = q->head->data;QNode* newhead = q->head->next;free(q->head);q->head = newhead;if (NULL == newhead)q->tail = NULL;--(q->size);return ret;
}QDataType QueueFront(Queue* q)
{assert(q);assert(!QueueEmpty(q));return q->head->data;
}QDataType QueueBack(Queue* q)
{assert(q);assert(!QueueEmpty(q));return q->tail->data;
}int QueueSize(Queue* q)
{assert(q);return q->size;
}bool QueueEmpty(Queue* q)
{assert(q);return !(q->size);
}

MyStack.h

#pragma once
#include"Queue.h"typedef struct MyStack
{Queue* qa;Queue* qb;
} MyStack;MyStack* myStackCreate();void myStackPush(MyStack* st, int x);QDataType myStackPop(MyStack* st);QDataType myStackTop(MyStack* st);bool myStackEmpty(MyStack* st);void myStackFree(MyStack* st);

MyStack.c

#include "MyStack.h"MyStack* myStackCreate()
{MyStack* st = (MyStack*)malloc(sizeof(MyStack));if (NULL == st){perror("malloc failed");exit(-1);}st->qa = QueueCreate();st->qb = QueueCreate();return st;
}void myStackPush(MyStack* st, QDataType x)
{assert(st);if (QueueEmpty(st->qb))QueuePush(st->qa, x);elseQueuePush(st->qa, x);
}QDataType myStackPop(MyStack* st)
{assert(st);assert(!myStackEmpty(st));Queue* empty = st->qa;Queue* noempty = st->qb;if (!QueueEmpty(st->qa)){empty = st->qb;noempty = st->qa;}QDataType ret = noempty->tail->data;while (QueueSize(noempty) > 1){QDataType ret = QueuePop(noempty);QueuePush(empty, ret);}QueuePop(noempty);return ret;
}QDataType myStackTop(MyStack* st)
{assert(st);assert(!myStackEmpty(st));if (QueueEmpty(st->qb))return st->qa->tail->data;elsereturn st->qb->tail->data;
}bool myStackEmpty(MyStack* st)
{return (QueueEmpty(st->qa) && QueueEmpty(st->qb));
}void myStackFree(MyStack* st)
{QueueDestroy(st->qa);QueueDestroy(st->qb);free(st);
}

test.c

#include<stdio.h>
#include "MyStack.h"static void Qprint(Queue* q)
{assert(q);QNode* cur = q->head;printf("head<-");while (cur){printf("%d<-", cur->data);cur = cur->next;}printf("tail\n");
}void test1()
{MyStack* st = myStackCreate();myStackPush(st, 1);myStackPush(st, 2);printf("top = %d\n", myStackTop(st));myStackPush(st, 3);printf("qa:"); Qprint(st->qa); printf("qb:"); Qprint(st->qb);printf("top = %d\n", myStackTop(st));myStackPush(st, 4);printf("qa:"); Qprint(st->qa); printf("qb:"); Qprint(st->qb);printf("top = %d\n", myStackTop(st));myStackPop(st);printf("qa:"); Qprint(st->qa); printf("qb:"); Qprint(st->qb);myStackPop(st);printf("qa:"); Qprint(st->qa); printf("qb:"); Qprint(st->qb);printf("top = %d\n", myStackTop(st));myStackFree(st);
}int main()
{test1();return 0;
}

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

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

相关文章

【办公类-04-03】华为助手导出照片视频分类(根据图片、视频的文件名日期分类导出)

背景需求&#xff1a; 用华为手机助手导出的照片视频&#xff0c;只能将jpg照片&#xff08;exifread读取图片的exif拍摄日期&#xff0c;Png、JPEG、mp4都无法识别到exif信息&#xff09; 【办公类-04-02】华为助手导出照片&#xff08;jpg&#xff09;读取拍摄时间分类导出…

LeetCode | 709.转换成小写字母

这道题可以用api也可以自己实现&#xff0c;都不难&#xff0c;大小字母之前相差了32&#xff0c;检查到大写字母时加上32即可 class Solution(object):def toLowerCase(self, s):""":type s: str:rtype: str"""return s.lower()class Solution…

试论地产需求政策的有效性边界

分析师通过对传统框架因子的分析和美日地产的回顾&#xff0c;指出收入政策将成为核心&#xff0c;测算认为地方收储面积约0.5-1.1亿平、收储资金0.8-1.9万亿元&#xff0c;70城二手房价降幅收窄至[-4.5%&#xff0c;-1.6%]。 事件&#xff1a;2024年5月17日&#xff0c;央行印…

git 快速将当前目录添加仓储

一、进入目录 git init git add . git commit -m "init" git remote add origin http://192.168.31.104/root/AutoBuildDemo.git 二、登录gitlab&#xff0c;创建项目AutoBuildDemo 最后执行&#xff1a; git push -u origin master

Github 2024-06-12 C开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10PHP项目1PLpgSQL项目1C++项目1Ventoy: 100%开源的可启动USB解决方案 创建周期:1534 天开发语言:C协议类型:GNU General Public Licen…

2024年7款硬盘恢复软件:即刻恢复硬盘删除的文件!

当文件被删除后&#xff0c;它并不是立即从硬盘中消失&#xff0c;而是被标记为“已删除”&#xff0c;等待垃圾回收处理。因此&#xff0c;在文件被删除后&#xff0c;有几种方法可以尝试恢复删除的数据。 以下是7款常用的数据恢复软件&#xff0c;以及它们的详细介绍&#xf…

单片机与DHT11温湿度检测设计

本次设计是采用STC89C54单片机加上低成本的温湿度模块DHT11构成的温湿度检测系统。设计主要由硬件与软件两部分设计构成。硬件方面包括单片机STC89C54、温湿度模块DHT11、显示模块LCD1602、电池电源、I2C存储器以及控制按键等5个部分。此系统完全基于单片机最小系统并进行一定的…

【C++ | 静态成员】类的 静态(static)数据成员、静态(static)成员函数 详解及例子代码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-16 0…

Electron+vite+vuetify项目搭建

最近想用Electron来进行跨平台的桌面应用开发。同时想用vuetify作为组件&#xff0c;于是想搭建一个这样的开发环境。其中踩了不少坑&#xff0c;总是会出现各种的编译错误和问题&#xff0c;依赖的各种问题&#xff0c;搞了好久最终环境终于弄好可正常开发了。这里分享下快速搭…

践行国产化替代,优刻得私有云勇当先锋

编辑&#xff1a;阿冒 设计&#xff1a;沐由 阳泉&#xff0c;十万火急&#xff01; 位于太行山西麓的山西省阳泉市&#xff0c;是一座历史悠久、底蕴深厚、资源丰富的名城&#xff0c;拥有超百万常住人口&#xff0c;国内生产总值在2022年成功跨越千亿元大关。然而&#xff0c…

RocketMQ源码学习笔记:源码启动NameServer,Broker

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview2、NameServer2.1、源码启动NameServer 3、Broker启动过程 1、Overview 这篇文章的源码的版本是release-4.9.8。在启动各个模块之前应该先对项目进行打包mvn install -Dmaven.te…

OS复习笔记ch9-1

单处理器调度 调度类型 主要类型 长程调度&#xff1a;决定将哪个进程放入进程池中 中程调度&#xff1a;决定将哪些进程部分或者全部放入内存中 短程调度&#xff1a;决定哪个空闲进程上处理机 I/O调度&#xff1a;决定哪个进程的I/O请求被可用的I/O设备处理 处理器调度和进…

jupyter notebook中使用不同的anaconda环境及常用conda命令

conda命令 在jupyter notebook中使用不同的anaconda环境其他常用conda命令 在jupyter notebook中使用不同的anaconda环境 创建环境 myenvname 需替换为自己的环境名称 conda create --name myenvname python3.7激活环境 conda activate myenvname 在该环境中安装Jupyter N…

springboot原理篇-springboot

springboot原理篇-springboot&#xff08;三&#xff09; 一、起步依赖 虽然我是直接学习springboot的&#xff0c;没有经历过使用spring开发&#xff0c;但是鉴于我还学习了c,对依赖这方面真的一言难尽&#xff01;springboot起步依赖解决依赖问题我实在是羡慕&#xff01; 直…

第 18章 安全架构设计理论与实践

安全架构是架构面向安全性方向上的一种细分&#xff0c;可关注三个安全方面&#xff0c;即产品安全架构、安全技术体系架构和审计架构&#xff0c;这三个方面可组成三道安全防线。本章主要分析安全威胁、介绍安全模型&#xff0c;在此基础上&#xff0c;就系统、信息、网络和数…

从0开始理解DevOps

目录 一、DevOps背景 二、DevOps介绍 DevOps 组成 三、Jenkins Jenkins 工作流程 四、云原生与DevOps 相信你一定听过 DevOps 这个词&#xff0c;那它到底是什么呢&#xff1f;为什么越来越多的互联网企业都在追随使用它&#xff1f;它与云原生有什么关系&#xff1f;本文将…

VRChat 2024年裁员原因与背景深度分析

VRChat&#xff0c;作为2022年元宇宙/VR社交领域的巨头&#xff0c;近期在2024年宣布裁员计划&#xff0c;其背后原因和背景值得业界尤其是仍在纯元宇宙虚拟空间创业的同仁们重点关注。 一、创始人决策失误 根据CEO的邮件披露&#xff0c;VRChat的创始人因缺乏经验和过度自信…

Java 桥接模式(Bridge Pattern)是设计模式中的一种结构型设计模式,桥接模式的核心思想是将抽象与实现解耦

桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。桥接模式的核心思想是将抽象与实现解耦&#xff0c;使得它们可以独立扩展。 在桥接模式中&#xff0c;通常包含以下四个…

MySQL之优化服务器设置(四)

优化服务器设置 InnoDB的IO配置 双写缓冲(Doublewrite Buffer) InnoDB用双写缓冲来避免页没写完整所导致的数据损坏。当一个磁盘写操作不能完整地完成时&#xff0c;不完整的页写入就可能发生&#xff0c;16KB的页可能只有一部分被写到磁盘上。有多种多样的原因(崩溃、Bug&am…

【纯干货级教程】深度学习根据loss曲线进行分析调参

相信很多刚刚接触目标检测系列算法小伙伴跑深度学习算法时会有许多困惑&#xff0c;比如训练得出的loss曲线有什么意义&#xff1f;训练的一些参数要如何设置选择&#xff1f;选择哪个算法模型作为baseline、选择哪个参数量/复杂度/深度的模型进行训练最为合适&#xff1f; 本…