栈和队列的算法题目(C语言)

1. 括号匹配问题

20. 有效的括号 - 力扣(LeetCode)

利用栈后入先出的特性解题

1.判断字符串是否为空 为空返回

2.创建栈,遍历字符串

        第一个字符是左括号的情况:入栈->继续遍历下一个字符

        第一个字符是右括号的情况:从栈顶取元素,判断当前右括号是否匹配栈顶的左括号

3.遍历结束,判断栈是否为空,为空说明所有括号都已匹配,不为空说明有左括号没有匹配上

bool isValid(char* s) {Stack st;StackInit(&st);int count = 0;while(s[count]){if(s[count] == '(' || s[count] == '['|| s[count] == '{'){StackPush(&st,s[count]);}else{if(StackEmpty(&st)){StackDestory(&st);return false;}char top = StcakTop(&st);if(top == '(' && s[count] != ')'||top == '{' && s[count] != '}'||top == '[' && s[count] != ']'){StackDestory(&st);return false;}StackPop(&st);}count++;}int  result = StackEmpty(&st);StackDestory(&st);return result;
}

2. 用队列实现栈

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

队列的特性是先入先出 栈的特性是后入先出

创建两个队列

为空的情况:两个队列都为空

1.push插入:直接插入队列中

2.需要pop的时候,将队列的元素导到另一个队列,最后一个元素就是栈顶元素

3.当有元素需要插入,判断哪个队列不为空,就直接插入

typedef struct {Queue* q1;Queue* q2;
} MyStack;MyStack* myStackCreate() {MyStack* newQueue = (MyStack*)malloc(sizeof(MyStack));newQueue->q1 =(Queue*)malloc(sizeof(Queue));newQueue->q2 =(Queue*)malloc(sizeof(Queue));QueueInit(newQueue->q1);QueueInit(newQueue->q2);return newQueue;
}void myStackPush(MyStack* obj, int x) {Queue* empty = obj->q1;Queue* noempty = obj->q2;if(QueueEmpty(noempty)){empty = obj->q1;noempty = obj->q2;}QueuePush(noempty,x);
}int myStackPop(MyStack* obj) {Queue* empty = obj->q1;Queue* noempty = obj->q2;int val = 0;if(QueueEmpty(noempty)){empty = obj->q2;noempty = obj->q1;}while(noempty->_size > 1){int val = QueueFront(noempty);QueuePush(empty,val);QueuePop(noempty);}if(noempty->_size == 1){val = QueueFront(noempty);QueuePop(noempty);}return val;
}int myStackTop(MyStack* obj) {Queue* empty = obj->q1;Queue* noempty = obj->q2;int val = 0;if(QueueEmpty(noempty)){empty = obj->q2;noempty = obj->q1;}val = noempty->_rear->_data;return val;
}bool myStackEmpty(MyStack* obj) {return QueueEmpty(obj->q1) && QueueEmpty(obj->q2);
}void myStackFree(MyStack* obj) {Queue* empty = obj->q1;Queue* noempty = obj->q2;if(QueueEmpty(noempty)){empty = obj->q2;noempty = obj->q1;}QueueDestory(noempty);free(obj->q1);free(obj->q2);free(obj);
}

3. 用栈实现队列

stack1存放要进栈的元素

stack2存放要出栈的元素

当stack2为空时   将stack1的所有元素都导到stack2中

插入:

1.直接使用StackPush插入到stack1中

删除:

1.判断stack2是否为空,为空将stack1的数据导到stack2内

2.直接使用StackPop()取到栈顶元素返回

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

typedef struct {Stack* s1;Stack* s2;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* newQueue = (MyQueue*)malloc(sizeof(MyQueue));newQueue->s1 = (Stack*)malloc(sizeof(Stack));newQueue->s2 = (Stack*)malloc(sizeof(Stack));StackInit(newQueue->s1);StackInit(newQueue->s2);return newQueue;
}void myQueuePush(MyQueue* obj, int x) {StackPush(obj->s1,x);
}int myQueuePop(MyQueue* obj) {if(StackEmpty(obj->s2)){while(!StackEmpty(obj->s1)){StackPush(obj->s2,StackPop(obj->s1));}}return StackPop(obj->s2);
}int myQueuePeek(MyQueue* obj) {if(StackEmpty(obj->s2)){while(!StackEmpty(obj->s1)){StackPush(obj->s2,StackPop(obj->s1));}}return StcakTop(obj->s2);
}bool myQueueEmpty(MyQueue* obj) {return StackEmpty(obj->s1) && StackEmpty(obj->s2);
}void myQueueFree(MyQueue* obj) {StackDestory(obj->s1);StackDestory(obj->s2);free(obj->s1);free(obj->s2);free(obj);
}

4. 设计循环队列

622. 设计循环队列 - 力扣(LeetCode)

使用数组来设计循环队列,当head走到最后一个元素就使用%来使数组循环

head就是队头,tail就是队尾

从队头出数据,队尾入数据

题目要求队列长度为k,我们申请k+1个空间用来区分队列满和不满的情况

当head==tail就是队列为空
当tail的下一个位置的元素==head就表示队列为满

typedef struct {int *Queue;int k;int head;int tail;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* newQueue = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));newQueue->tail = newQueue->head = 0;newQueue->k = k + 1; newQueue->Queue = (int*)malloc(sizeof(int)*(k+1));return newQueue;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->head == obj->tail;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->tail+1)%(obj->k) == obj->head;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj)){return false;}obj->Queue[obj->tail] = value;obj->tail = (obj->tail+1)%(obj->k);return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)){return false;}obj->head = (obj->head+1)%(obj->k);return true;
}int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)){return -1;}return obj->Queue[obj->head];
}int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)){return -1;}return obj->Queue[(obj->tail-1+obj->k) % obj->k];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->Queue);free(obj);
}

栈的C语言代码:

typedef char StackDataType;typedef struct StackNode
{StackDataType* _stack;int _capacity;int _top;
}Stack;void StackInit(Stack* st);
void StackPush(Stack* st, StackDataType data);
void StackPop(Stack* st);
StackDataType StcakTop(Stack* st);
int StackSize(Stack* st);
int StackEmpty(Stack* st);
void StackDestory(Stack* st);
void StackInit(Stack* st)
{st->_stack = NULL;st->_capacity = 0;st->_top = 0;
}
void StackPush(Stack* st, StackDataType data)
{assert(st);if (st->_capacity == st->_top){int newCapacity = st->_capacity == 0?4:st->_capacity*2;st->_stack = (StackDataType*)realloc(st->_stack, newCapacity * sizeof(StackDataType));st->_capacity = newCapacity;}st->_stack[st->_top] = data;st->_top++;
}
void StackPop(Stack* st)
{assert(st);assert(st->_top);st->_top--;
}
StackDataType StcakTop(Stack* st)
{assert(st);return st->_stack[st->_top-1];
}
int StackSize(Stack* st)
{assert(st);return st->_top;
}
int StackEmpty(Stack* st)
{assert(st);if (st->_top == 0){return true;}else{return false;}
}
void StackDestory(Stack* st)
{assert(st);free(st->_stack);st->_stack = NULL;st->_capacity = st->_top = 0;}

队列的C语言代码:

typedef int QueueNodeDataType;
typedef struct QListNode
{struct QListNode* _pNext;QueueNodeDataType _data;
}QNode;typedef struct Queue
{QNode* _front;QNode* _rear;int _size;
}Queue;void QueueInit(Queue* q);
void QueuePush(Queue* q, QueueNodeDataType val);
void QueuePop(Queue* q);
bool QueueEmpty(Queue* q);
int QueueSize(Queue* q);
QueueNodeDataType QueueFront(Queue* q);
QueueNodeDataType Queuerear(Queue* q);
void QueueDestory(Queue* q);
void QueueInit(Queue* q)
{assert(q);q->_front = NULL;q->_rear = NULL;q->_size = 0;
}
void QueuePush(Queue* q, QueueNodeDataType val)
{assert(q);QNode* newNode = (QNode*)malloc(sizeof(QNode));assert(newNode);newNode->_data = val;newNode->_pNext = NULL;if (q->_front == NULL)//队列没有结点{q->_front = q->_rear = newNode;}else{q->_rear->_pNext = newNode;q->_rear = newNode;}q->_size++;
}
void QueuePop(Queue* q)
{assert(q);if (q->_front == NULL){return;}else{if (q->_front == q->_rear)//说明只有一个结点{free(q->_front);q->_front = q->_rear = NULL;}else{QNode* cur = q->_front->_pNext;free(q->_front);q->_front = cur;}}q->_size--;
}
bool QueueEmpty(Queue* q)
{assert(q);return q->_front == NULL;
}
int QueueSize(Queue* q)
{assert(q);return q->_size;
}
QueueNodeDataType QueueFront(Queue* q)
{assert(q);assert(q->_front);return q->_front->_data;
}
QueueNodeDataType Queuerear(Queue* q)
{assert(q);assert(q->_rear);return q->_rear->_data;
}
void QueueDestory(Queue* q)
{assert(q);QNode* cur = q->_front;while (cur){QNode* tmp = cur;cur = cur->_pNext;free(tmp);}q->_front = q->_rear = NULL;}

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

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

相关文章

CAD图1

文章目录 选择直线工具选择圆形选中圆形 选择直线工具 画一条十字中心线 选择圆形 以十字中心为起点画一个半径为 53 的圆形 选中圆形 选中圆形,捕捉右侧圆形焦点

【算法专题】穷举vs暴搜vs深搜vs回溯vs剪枝

二叉树剪枝 LCR 047. 二叉树剪枝 - 力扣(LeetCode) 本题要求我们将全部为0的二叉树去掉,也就是剪枝,当我们举一个具体的例子进行模拟时,会发现,只关注于对其中一个子树的根节点进行剪枝,由于我…

4款AI生成PPT工具推荐,提升工作效率

在如今的工作环境中,PPT制作是许多技术人员不可避免的任务,尤其是在汇报、展示技术方案、以及项目进展时。随着AI技术的快速发展,使用AI生成PPT成为了提高效率的一种新趋势。本文将介绍几款适合程序员、技术人员的AI生成PPT工具,帮…

强化学习——马尔可夫决策过程(MDP)【附 python 代码】

一、马尔可夫过程 过程介绍随机过程在某时刻 t 的状态 S t S_t St​ 通常取决于 t 时刻之前的状态。状态 S t 1 S_{t1} St1​ 的概率表示为: P ( S t 1 ∣ S 1 , . . . , S t ) P(S_{t1}|S_1,...,S_t) P(St1​∣S1​,...,St​)马尔可夫过程某时刻 t 的状态只取…

JAVA-集合相关

HashMap如何解决哈希冲突的? 计算hash值,基于hashCode计算冲突之后,先是使用链式寻址法当链表长度大于8,且hash表的容量大于60的时候,再添加元素则转化成红黑树 为什么计算hash值是,是将hash地址的值右移1…

大数据Flink(一百一十八):Flink SQL水印操作(Watermark)

文章目录 Flink SQL水印操作(Watermark) 一、为什么要有WaterMark 二、​​​​​​​​​​​​​​Watermark解决的问题 三、​​​​​​​​​​​​​​代码演示 Flink SQL水印操作(Watermark) 一、​​​​​​​为什么…

43.常用C++编译器推荐——《跟老吕学C++》

43.常用C编译器推荐——《跟老吕学C》 常用C编译器推荐一、C编译器介绍1. GCC (GNU Compiler Collection)2. Clang2.1 Clang的特点2.2 Clang的应用场景2.3 Clang与GCC的比较 3. Microsoft Visual C (MSVC)MSVC的特点MSVC的使用场景MSVC与其他编译器的比较 4. Intel C Compiler4…

【Midjourney中文版】

Midjourney中文版打破了传统创作工具的界限,无需具备专业的艺术技能或复杂的软件操作能力,即可轻松创作出高质量的图片。它支持多种创作模式,包括文生图、图生图、图片混图融合等,满足多样化的创作需求。 打开Midjourney中文版后…

istio中如何使用serviceentry引入外部服务

假设需要引入一个外部服务,外部服务ip为10.10.102.90,端口为32033. 引入到istio中后,我想通过域名gindemo.test.ch:9090来访问这个服务。 serviceentry yaml内容如下: apiVersion: networking.istio.io/v1beta1 kind: ServiceEn…

【Pycharm】Pycharm创建Django提示pip版本需要升级

目录 1、现象 2、分析 3、本质 前言:经常使用pycharm创建django、flask等项目时候提示pip版本需要升级,解决方案 1、现象 使用Pycharm创建Django项目提示安装Django超时,报错建议pip升级22升级到24 2、分析 之前使用命令升级了pip到了24…

VS code EXPLORER 中不显示指定文件及文件夹设置(如.pyc, __pycache__, .vscode 文件)

VS code EXPLORER 中不显示指定文件及文件夹设置 引言正文方法1打开方式1打开方式2 方法2 引言 VS code 号称地表最强轻量级编译器,其最大的优势在于用户可以根据自己的需求下载适合自己的 extension。从而定制个性化的编译器。然而,本人今天遇到了一个…

出厂非澎湃OS手机解BL锁

脚本作者:酷安mlgmxyysd 脚本项目链接:https://github.com/MlgmXyysd/Xiaomi-HyperOS-BootLoader-Bypass/ 参考 B站作者:蓝空穹 https://www.bilibili.com/read/cv33210124/ 其他参考:云墨清风、水墨青竹、Magisk中文网 决定解BL…

设计模式 组合模式(Composite Pattern)

组合模式简绍 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以用一致的方式处理单个对象和组合对象。这样,可以在不知道对象具体类型的条…

通信工程学习:什么是ONT光网络终端

ONT:光网络终端 ONT(Optical Network Terminal,光网络终端)是光纤接入网络(FTTH)中的关键设备,用于将光纤信号转换为电信号或将电信号转换为光信号,以实现用户设备与光纤网络的连接。…

Koa (下一代web框架) 【Node.js进阶】

koa (中文网) 是基于 Node.js 平台的下一代 web 开发框架,致力于成为应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石; 利用 async 函数 丢弃回调函数,并增强错误处理,koa 没有任何预置的中间件,可快速…

计算机组成原理(笔记3)

IEEE754浮点数标准 这里只讲32位单精度 S——尾数符号,0正1负; M——尾数, 纯小数表示, 小数点放在尾数域的最前面。 一般采用原码或补码表示。 E——阶码,采用“移码”表示; 阶符采用隐含方式,即采用“移码”方法来表示正负指数…

Python 之数据库操作(Python Database Operations)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

基于SSM的在线家用电器销售系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSSMVueMySQL的在线家…

统信服务器操作系统【1050e版】安装手册

统信服务器操作系统1050e版本的安装 文章目录 功能概述一、准备环境二、安装方式介绍安装步骤步骤一:制作启动盘步骤二:系统的安装步骤三:安装引导界面步骤四:图形化界面安装步骤五:选择安装引导程序语言步骤六:进入安装界面步骤七:设置键盘步骤八:设置系统语言步骤九:…

链接升级:Element UI <el-link> 的应用

链接升级&#xff1a;Element UI 的应用 一 . 创建文字链接1.1 注册路由1.2 创建文字链接 二 . 文字链接的属性2.1 文字链接的颜色2.2 是否显示下划线2.3 是否禁用状态2.4 填写跳转地址2.5 加入图标 在本篇文章中&#xff0c;我们将深入探索Element UI中的<el-link>组件—…