leetcode栈和队列的相关题、有效的括号、用队列实现栈、用栈实现队列、设计循环队列等介绍

文章目录

  • 前言
  • 一、有效的括号
  • 二、用队列实现栈
  • 三、 用栈实现队列
  • 四、设计循环队列
  • 总结


前言

leetcode栈和队列的相关题、有效的括号、用队列实现栈、用栈实现队列、设计循环队列等介绍


一、有效的括号

leetcode有效的括号
在这里插入图片描述



// 动态增长的栈
typedef char STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;// 初始化栈
void STInit(ST* ps);// 销毁栈
void STDestroy(ST* ps);// 插入
void STPush(ST* ps, STDataType x);// 出栈
void STPop(ST* ps);// 检查是否为空
bool STEmpty(ST* ps);// 获取栈顶元素
STDataType STTop(ST* ps);//获取有效元素的个数
int STSize(ST* ps);// 初始化栈
void STInit(ST* ps)
{assert(ps);ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);if (ps->a == NULL){perror("STInit malloc");return;}ps->top = 0; // top指的是栈顶元素的下一个位置//ps->top = -1; // top 指的是栈顶元素ps->capacity = 4;
}// 销毁栈
void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a == NULL;ps->top = 0;ps->capacity = 0;
}// 入栈
void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * ps->capacity * 2);if (tmp == NULL){perror("STPush relloc");return;}ps->a = tmp;ps->capacity *= 2;}ps->a[ps->top] = x;ps->top++;
}// 出栈
void STPop(ST* ps)
{assert(ps);assert(!STEmpty(ps));ps->top--;
}// 检查是否为空
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}// 获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);assert(!STEmpty(ps));return ps->a[ps->top - 1];
}// 获取有效元素的个数
int STSize(ST* ps)
{assert(ps);return ps->top;
}bool isValid(char* s) {ST st;STInit(&st);while(*s){if(*s == '(' || *s == '[' || *s == '{'){STPush(&st, *s);}else{if(STEmpty(&st)){STDestroy(&st);return false;}char top = STTop(&st);STPop(&st);if((*s == ')' && top != '(')|| (*s == ']' && top != '[')|| (*s == '}' && top != '{')){STDestroy(&st);return false;}}s++;}bool ret = STEmpty(&st);STDestroy(&st);return ret;
}

二、用队列实现栈

leetcode用队列实现栈

在这里插入图片描述


typedef int QDataType;typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;int size;
} Queue;// 初始化队列
void QInit(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;pq->size = 0;}// 销毁队列
void QDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->head;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->head = pq->tail = NULL;pq->size = 0;
}// 入队列
void QPush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("QPush()::malloc()");return;}newnode->next = NULL;newnode->data = x;if (pq->head == NULL){assert(pq->tail == NULL);pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = pq->tail->next;}pq->size++;
}// 出队列
void QPop(Queue* pq)
{assert(pq);assert(pq->head != NULL);if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{QNode* cur = pq->head;pq->head = cur->next;free(cur);cur = NULL;}pq->size--;}// 获取队列元素个数
int QSize(Queue* pq)
{assert(pq);return pq->size;
}// 判断队列是否为空
bool QEmpty(Queue* pq)
{assert(pq);return (pq->head == NULL && pq->tail == NULL);
}// 找到队列的头元素
QDataType QFront(Queue* pq)
{assert(pq);assert(!QEmpty(pq));return (pq->head->data);
}// 找到队列的尾元素
QDataType QBack(Queue* pq)
{assert(pq);assert(!QEmpty(pq));return (pq->tail->data);
}typedef struct {Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {MyStack* pst = (MyStack*)malloc(sizeof(MyStack));if(pst == NULL){perror("myStackCreate malloc");return NULL;}QInit(&pst->q1);QInit(&pst->q2);return pst;
}void myStackPush(MyStack* obj, int x) {if(!QEmpty(&obj->q1)){QPush(&obj->q1, x);}else{QPush(&obj->q2, x);}
}int myStackPop(MyStack* obj) {Queue* empty = &obj->q1;Queue* nonempty = &obj->q2;if(!QEmpty(&obj->q1)){empty = &obj->q2;nonempty = &obj->q1;}while(QSize(nonempty) > 1){QPush(empty, QFront(nonempty));QPop(nonempty);}int top = QFront(nonempty);QPop(nonempty);return top;
}int myStackTop(MyStack* obj) {if(!QEmpty(&obj->q1)){return QBack(&obj->q1);}else{return QBack(&obj->q2);}
}bool myStackEmpty(MyStack* obj) {return (QEmpty(&obj->q1) && QEmpty(&obj->q2));
}void myStackFree(MyStack* obj) {QDestroy(&obj->q1);QDestroy(&obj->q2);obj = NULL;
}/*** 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);
*/

三、 用栈实现队列

leetcode用栈实现队列

在这里插入图片描述


// 动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;// 初始化栈
void STInit(ST* ps);// 销毁栈
void STDestroy(ST* ps);// 插入
void STPush(ST* ps, STDataType x);// 出栈
void STPop(ST* ps);// 检查是否为空
bool STEmpty(ST* ps);// 获取栈顶元素
STDataType STTop(ST* ps);//获取有效元素的个数
int STSize(ST* ps);// 初始化栈
void STInit(ST* ps)
{assert(ps);ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);if (ps->a == NULL){perror("STInit malloc");return;}ps->top = 0; // top指的是栈顶元素的下一个位置//ps->top = -1; // top 指的是栈顶元素ps->capacity = 4;
}// 销毁栈
void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a == NULL;ps->top = 0;ps->capacity = 0;
}// 入栈
void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * ps->capacity * 2);if (tmp == NULL){perror("STPush relloc");return;}ps->a = tmp;ps->capacity *= 2;}ps->a[ps->top] = x;ps->top++;
}// 出栈
void STPop(ST* ps)
{assert(ps);assert(!STEmpty(ps));ps->top--;
}// 检查是否为空
bool STEmpty(ST* ps)
{assert(ps);return (ps->top == 0);
}// 获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);assert(!STEmpty(ps));return ps->a[ps->top - 1];
}// 获取有效元素的个数
int STSize(ST* ps)
{assert(ps);return ps->top;
}typedef struct {ST pushst;ST popst;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* tmp = (MyQueue*)malloc(sizeof(MyQueue));if(tmp == NULL){perror("myQueueCreate malloc");return NULL;}STInit(&tmp->pushst);STInit(&tmp->popst);return tmp;
}void myQueuePush(MyQueue* obj, int x) {STPush(&obj->pushst, x);
}int myQueuePop(MyQueue* obj) {if(STEmpty(&obj->popst)){while(!STEmpty(&obj->pushst)){STPush(&obj->popst, STTop(&obj->pushst));STPop(&obj->pushst);}}int front = STTop(&obj->popst);STPop(&obj->popst);return front;
}int myQueuePeek(MyQueue* obj) {if(STEmpty(&obj->popst)){while(!STEmpty(&obj->pushst)){STPush(&obj->popst, STTop(&obj->pushst));STPop(&obj->pushst);}}int front = STTop(&obj->popst);return front;
}bool myQueueEmpty(MyQueue* obj) {return (STEmpty(&obj->pushst) && STEmpty(&obj->popst));
}void myQueueFree(MyQueue* obj) {STDestroy(&obj->pushst);STDestroy(&obj->popst);free(obj);obj = NULL;
}/*** 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);
*/

四、设计循环队列

leetcode设计循环队列

在这里插入图片描述



typedef struct {int* a;int Front;int Rear;int k;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* tmp = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));tmp->a = (int*)malloc(sizeof(int) * (k+1));tmp->Front = tmp->Rear = 0;tmp->k = k;return tmp;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return (obj->Front == obj->Rear);
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->Front == (obj->Rear + 1) % (obj->k + 1));
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {// 判断是否满了if(myCircularQueueIsFull(obj)){return false;}// 没满obj->a[obj->Rear] = value;obj->Rear++;obj->Rear = obj->Rear % (obj->k + 1);return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {// 判断你是否为空if(myCircularQueueIsEmpty(obj)){return false;}obj->Front = obj->Front % (obj->k + 1);obj->Front++;return true;}int myCircularQueueFront(MyCircularQueue* obj) {// 判断队列为空 返回 -1if(myCircularQueueIsEmpty(obj)){return - 1;}return obj->a[obj->Front];
}int myCircularQueueRear(MyCircularQueue* obj) {// 判断队列为空 返回 -1if(myCircularQueueIsEmpty(obj)){return -1;}return obj->a[(obj->Rear-1 + (obj->k + 1)) % (obj->k + 1)];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);obj->a = NULL;obj->Front = obj->Rear = 0;obj->k = 0;free(obj);
}/*** Your MyCircularQueue struct will be instantiated and called as such:* MyCircularQueue* obj = myCircularQueueCreate(k);* bool param_1 = myCircularQueueEnQueue(obj, value);* bool param_2 = myCircularQueueDeQueue(obj);* int param_3 = myCircularQueueFront(obj);* int param_4 = myCircularQueueRear(obj);* bool param_5 = myCircularQueueIsEmpty(obj);* bool param_6 = myCircularQueueIsFull(obj);* myCircularQueueFree(obj);
*/

总结

leetcode栈和队列的相关题、有效的括号、用队列实现栈、用栈实现队列、设计循环队列等介绍

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

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

相关文章

香港优才计划需要什么条件?一文给你说清2024优才政策、申请利弊及获批攻略

香港优才计划申请,竞争正逐渐加剧,在正式递交申请前,客观评估自身申请条件,找准个人履历中与香港人才引进的契合点,并在申请材料中详细表明,更有助于获批。 在申请之前,我们必须明白一个事实&a…

Hack The Box-BoardLight

总体思路 子域名收集->默认密码->信息泄露->CVE-2022-37706 信息收集&端口利用 nmap -sSVC boardlight.htb发现22和80端口开放,先看80端口网站信息 四处查看后,发现没有有效信息,对其进行目录扫描和子域名扫描 dirsearch -u…

總結力學_2

個人近況 最近搞了畢業論文,讓大家久等了... 梳理路徑 "普通物理学习的是基本的想法。这些想法最好能在学习过程中简单、直接地呈现出来。绝大部分的前沿知识无法满足这个要求。所谓前沿常常指的是新发现的事实,并未超出那些基本的想法,正所谓“太阳底下无新事”。真…

【吊打面试官系列】Java高并发篇 - 线程的调度策略?

大家好,我是锋哥。今天分享关于 【线程的调度策略?】面试题,希望对大家有帮助; 线程的调度策略? 线程调度器选择优先级最高的线程运行,但是,如果发生以下情况,就会终止线程的运行: 1、线程体…

ROS for LabVIEW:实现LabVIEW与ROS的无缝集成

ROS for LabVIEW是由Tufts大学开发的一套VI集合,旨在实现LabVIEW与ROS(Robot Operating System)的无缝集成。ROS是一个灵活的机器人软件框架,而LabVIEW则是一种强大的图形化编程工具。这个工具包的推出使得LabVIEW用户能够直接与R…

ACM实训冲刺第二十天

SUM Problem(数学计算与序列求和) 这段代码实现的是计算一个正整数n与其之前的所有正整数之和的问题,它属于数学计算与序列求和的题型。具体算法根据输入整数n的奇偶性采用了两种形式的等差数列求和公式: 如果n是偶数,…

时隔1年,我终于弄懂了Java 中的 AOP操作

1. AOP概述 2. AOP快速入门 依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>${spring-boot.version}</version></dependency> 示例:记…

如何使用 Re-Ranking 改进大模型 RAG 检索

基于大型语言模型&#xff08;LLMs&#xff09;的聊天机器人可以通过检索增强生成&#xff08;RAG&#xff09;提供外部知识来改进。 这种外部知识可以减少错误答案&#xff08;幻觉&#xff09;&#xff0c;并且使模型能够访问其训练数据中未包含的信息。 通过RAG&#xff0…

ciscn

ciscn Crypto部分复现 古典密码 先是埃特巴什密码&#xff08;这个需要进行多次测试&#xff09;&#xff0c;然后base64&#xff0c;再栅栏即可 答案&#xff1a;flag{b2bb0873-8cae-4977-a6de-0e298f0744c3} _hash 题目&#xff1a; #!/usr/bin/python2 # Python 2.7 (6…

Go程序出问题了?有pprof!

什么情况下会关注程序的问题&#xff1f; 一是没事儿的时候 二是真有问题的时候 哈哈哈&#xff0c;今天我们就来一起了解一下Go程序的排查工具&#xff0c;可以说即简单又优雅&#xff0c;它就是pprof。 在 Go 中&#xff0c;pprof 工具提供了一种强大而灵活的机制来分析 …

38、Flink 的窗口触发器(Triggers)详解

Triggers a&#xff09;概述 Trigger 决定了一个窗口&#xff08;由 window assigner 定义&#xff09;何时可以被 window function 处理&#xff1b;每个 WindowAssigner 都有一个默认的 Trigger&#xff0c;如果默认 trigger 无法满足需要&#xff0c;可以在 trigger(...) …

硬件工程师求职,笔试题交白卷,忍不了!

大家好&#xff0c;我是记得诚。 最近面试一位硬件工程师&#xff0c;笔试题直接交了白卷&#xff0c;我还是去面试了一下&#xff0c;会一会&#xff0c;看是何方神圣。 对方上来也是直接说明了一下&#xff0c;说工作有点久了&#xff0c;有些基础的知识忘记了&#xff0c;…

Pytorch深度学习实践笔记11(b站刘二大人)

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibi…

WindowsCMD窗口配置OhMyPosh

WindowsCMD窗口配置OhMyPosh 文章目录 WindowsCMD窗口配置OhMyPosh1. 按装Clink1. 安装Oh-My-Posh2. 安装Clink2. 安装后的位置 2. 编写Lua脚本1. oh-my-posh Lua脚本2. 重启cmd窗口看效果 OhMyPosh对Windows CMD 没有现成的支持。 然而可以使用Clink来做到这一点&#xff0c;它…

虚拟化知识学习

虚拟化知识学习 关键概念和术语的简要介绍 虚拟化的基本概念 虚拟机 (VM)&#xff1a;一个虚拟机是一个模拟计算机系统的环境。它运行在物理硬件之上&#xff0c;但与物理硬件隔离&#xff0c;提供类似于物理计算机的功能。 虚拟化技术&#xff1a;这是指使用软件来创建虚拟版…

【Java reentrantlock源码解读】

今天学习一下Java中lock的实现方式aqs 直接上图这是lock方法的实现类、分为公平锁和非公平锁两种。 先看非公平的实现方法、很暴力有木有&#xff0c;上来直接CAS&#xff08;抢占锁的方法&#xff0c;是一个原子操作&#xff0c;没有学过的同学自行百度哦&#xff09;&#…

软件测试面试题(六)

一&#xff1a;质量的八大特性是什么&#xff1f;各种特性的定义&#xff1f; 功能性&#xff1a;软件所实现的功能达到它的设计规范和满足用户需求的程度 性能&#xff1a;在规定的条件下实现软件功能所需的响应时间和计算机资源&#xff08;CPU、内存、磁盘空间和吞吐量&…

MagicaCloth2中文文档

提示&#xff1a;经搬运者测试&#xff0c;在ecs1.0中运行最为良好 如何安装 英语日语 目录 [隐藏] 1 如何安装2 样本运行测试3 可以删除示例文件夹4 如何更新5 发生错误时该怎么办6 如何卸载7 如何检查版本 如何安装 MagicaCloth2 需要 Unity 2021.3.16 &#xff08;LTS&…

jQuery效果2

jQuery 一、属性操作1.内容2.列子&#xff0c;购物车模块-全选 二、内容文本值1.内容2.列子&#xff0c;增减商品和小记 三、元素操作(遍历&#xff0c;创建&#xff0c;删除&#xff0c;添加&#xff09;1.遍历2.例子&#xff0c;购物车模块&#xff0c;计算总件数和总额3.创建…

【简单介绍下线性回归模型】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…