【数据结构】栈和队列

大家好!今天我们来学习数据结构中的栈和队列。

目录

1. 栈

1.1 栈的概念及结构

1.2 栈的定义

1.3 栈的接口实现

1.3.1 初始化栈

1.3.2 入栈

1.3.3 出栈

1.3.4 获取栈顶元素

1.3.5 获取栈中有效元素个数

1.3.6 检测栈是否为空

1.3.7 销毁栈

1.4 栈的完整代码

1.4.1 Stack.h

1.4.2 Stack.c

1.4.3 Test.c

2. 队列

2.1 队列的概念及结构

2.2 队列的定义

2.3 队列的接口实现

2.3.1 初始化队列

2.3.2 入队

2.3.3 出队

2.3.4 获取队头元素

2.3.5 获取队尾元素

2.3.6 获取队列中有效元素个数

2.3.7 检测队列是否为空

2.3.8 销毁队列

2.4 队列的完整代码

2.4.1 Queue.h

2.4.2 Queue.c

2.4.3 Test.c

3. 总结


1. 栈

1.1 栈的概念及结构

stack),又名堆栈。一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶另一端称为栈底中的数据元素遵守先进后出的原则。

入栈:栈的插入操作叫做入栈/进栈/压栈入数据在栈顶。(把新元素放在栈顶元素的上面,使之成为新的栈顶元素)。

出栈:栈的删除操作叫做出栈出数据也在栈顶。(把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素)。

 

 

1.2 栈的定义

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。因为静态顺序表不实用,所以我们使用动态顺序表实现栈。

//支持动态增长的栈
typedef int STDataType;
#define INIT_CAPACITY 4
typedef struct Stack
{STDataType* a;  //指向动态开辟的数组int top;  //栈顶int capacity;  //容量
}ST;

使用结构体创建一个支持动态增长的栈(用动态顺序表实现)。

STDataType替换int,方便对不同类型的数据进行修改。

ST替换struct Stack,方便简洁。

用宏定义INIT_CAPACITY将栈的初始容量设置为4。

1.3 栈的接口实现

栈的所有接口函数一览:

//初始化栈
void STInit(ST* ps);
//入栈
void STPush(ST* ps, STDataType x);
//出栈
void STPop(ST* ps);
//获取栈顶元素
STDataType STTop(ST* ps);
//获取栈中有效元素个数
int STSize(ST* ps);
//检测栈是否为空
bool STEmpty(ST* ps);
//销毁栈
void STDestroy(ST* ps);

这些接口函数主要实现了支持动态动态增长的栈的基本功能,接下来我们一一实现这些函数!

1.3.1 初始化栈

我们一开始将指针a置空让栈顶top为0栈的容量capacity也为0。这里要注意assert()断言,保证ps的合理性。

//初始化栈
void STInit(ST* ps)
{assert(ps);ps->a = NULL;ps->top = 0;ps->capacity = 0;
}

1.3.2 入栈

和动态顺序表的操作类似,入栈的时候,我们也需要考虑是否需要扩容。

这里当栈满了ps->top==ps->capacity)的时候,就需要扩容。

我们定义了一个变量newCapacity存储扩容后栈的新容量。我们将新容量扩充为原来的2倍,但是因为有可能原容量为0,所以我们这里使用了三目运算符。如果原容量为0,我们就将newCapacity设置为INIT_CAPACITY否则,我们就让newCapacity是原容量的2倍

之后使用realloc()函数进行扩容,我们用结构体指针tmp存取栈扩容后的地址

这里我们扩展一个知识点:

我们可以知道,如果一开始如果传的指针a为空realloc()函数的作用和malloc()函数作用相同。 

扩容完后就是让指针a指向tmp(ps->a=tmp),

让容量变为newCapacity(ps->capacity=newCapacity)。

入栈就是添加新元素在栈顶(ps->a[ps->top]=x),同时让栈顶top++。

//入栈
void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){int newCapacity = ps->capacity == 0 ? INIT_CAPACITY : ps->capacity * 2;STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);if (tmp == NULL){perror("realloc failed");exit(-1);}ps->a = tmp;ps->capacity = newCapacity;}ps->a[ps->top] = x;ps->top++;
}

1.3.3 出栈

栈中必须有元素我们才能进行出栈的操作。所以我们要使用assert(ps->a>0)断言,同时也要用assert()保证指针ps的合理性。

出栈我们直接让栈顶top--即可。

//出栈
void STPop(ST* ps)
{assert(ps);//空assert(ps->a > 0);--ps->top;
}

1.3.4 获取栈顶元素

栈中必须有元素我们才能获取栈顶元素。所以我们要使用assert(ps->a>0)断言,同时也要用assert()保证指针ps的合理性。

栈顶元素就是下标为top-1位置的元素。

//获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);//空assert(ps->a > 0);return ps->a[ps->top - 1];
}

1.3.5 获取栈中有效元素个数

assert()断言保证指针ps的合理性,直接返回top即可

//获取栈中有效元素个数
int STSize(ST* ps)
{assert(ps);return ps->top;
}

1.3.6 检测栈是否为空

assert()断言保证指针ps的合理性,判断top是否为0,并返回

//检测栈是否为空
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

1.3.7 销毁栈

assert()断言保证指针ps的合理性。将指针a置空,将栈顶top和容量capacity都为0

//销毁栈
void STDestroy(ST* ps)
{assert(ps);ps->a = NULL;ps->top = ps->capacity = 0;
}

1.4 栈的完整代码

1.4.1 Stack.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>//支持动态增长的栈
typedef int STDataType;
#define INIT_CAPACITY 4
typedef struct Stack
{STDataType* a;  //指向动态开辟的数组int top;  //栈顶int capacity;  //容量
}ST;//初始化栈
void STInit(ST* ps);
//入栈
void STPush(ST* ps, STDataType x);
//出栈
void STPop(ST* ps);
//获取栈顶元素
STDataType STTop(ST* ps);
//获取栈中有效元素个数
int STSize(ST* ps);
//检测栈是否为空
bool STEmpty(ST* ps);
//销毁栈
void STDestroy(ST* ps);

1.4.2 Stack.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"//初始化栈
void STInit(ST* ps)
{assert(ps);ps->a = NULL;ps->top = 0;ps->capacity = 0;
}//入栈
void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){int newCapacity = ps->capacity == 0 ? INIT_CAPACITY : ps->capacity * 2;STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);if (tmp == NULL){perror("realloc failed");exit(-1);}ps->a = tmp;ps->capacity = newCapacity;}ps->a[ps->top] = x;ps->top++;
}//出栈
void STPop(ST* ps)
{assert(ps);//空assert(ps->a > 0);--ps->top;
}//获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);//空assert(ps->a > 0);return ps->a[ps->top - 1];
}//获取栈中有效元素个数
int STSize(ST* ps)
{assert(ps);return ps->top;
}//检测栈是否为空
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}//销毁栈
void STDestroy(ST* ps)
{assert(ps);ps->a = NULL;ps->top = ps->capacity = 0;
}

1.4.3 Test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"void TestStack()
{ST st;STInit(&st);STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);STPush(&st, 5);while (!STEmpty(&st)){printf("%d ", STTop(&st));STPop(&st);}printf("\n");STDestroy(&st);
}int main()
{TestStack();return 0;
}

 

2. 队列

2.1 队列的概念及结构

队列queue)是一种特殊的线性表,只允许在表的后端rear)进行插入数据操作,只允许在表的前端front)进行删除数据操作。进行插入操作的一端称为队尾,进行删除操作的一端称为队头 。队列中的数据元素遵循先进先出的原则。

入队:在队尾插入一个队列元素称为入队

出队:从队头删除一个队列元素称为出队

 

 

 

2.2 队列的定义

队列也可以用数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低

typedef int QDataType;
typedef struct QueueNode
{QDataType data;struct QueueNode* next;
}QNode;

使用结构体创建一个队列(用单链表实现)。

QDataType替换int,方便对不同类型的数据进行修改。

QNode替换struct QueueNode,方便简洁。

typedef struct Queue
{QNode* head;QNode* tail;int size;
}Que;

我们这里再用一个结构体存储头指针head尾指针tail队列的长度size

2.3 队列的接口实现

队列的所有接口函数一览:

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int QDataType;
typedef struct QueueNode
{QDataType data;struct QueueNode* next;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;int size;
}Que;//初始化队列
void QueueInit(Que* pq);
//队尾入队列
void QueuePush(Que* pq,QDataType x);
//队头出队列
void QueuePop(Que* pq);
//获取队列头部元素
QDataType QueueFront(Que* pq);
//获取队列队尾元素
QDataType QueueBack(Que* pq);
//获取队列中有效元素个数
QDataType QueueSize(Que* pq);
//检测队列是否为空
bool QueueEmpty(Que* pq);
//销毁队列
void QueueDestroy(Que* pq);

这些接口函数主要实现了队列的基本功能,接下来我们一一实现这些函数!

2.3.1 初始化队列

头指针head尾指针tail置空,将size置为0。这里要注意assert()断言,保证pq指针的合理性。

//初始化队列
void QueueInit(Que* pq)
{assert(pq);pq->head = pq->tail = NULL;pq->size = 0;
}

2.3.2 入队

首先使用assert()断言,保证pq指针的合理性。

接着我们使用malloc()函数创建一个新结点。如果malloc()函数的返回值为空(即这里的newnode==NULL),我们就用perror()函数打印提示相应错误,并用exit(-1)退出整个程序

我们将这个新结点的值赋为xnewnode->data=x),

新结点的next指针置空(newnode->next=NULL)。

入队其实就是进行单链表的尾插操作,但是也需要考虑不同情况:

(1)如果是尾插第一个结点,我们就让头指针head和尾指针tail都指向新结点newnode。

(2)其他情况就正常尾插,让tail的next指向新结点newnode,同时tail往后走一步。

最后我们让size++即可。

//入队
void QueuePush(Que* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc failed");exit(-1);}newnode->data = x;newnode->next = NULL;if (pq->tail == NULL){pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}

2.3.3 出队

首先使用assert()断言,保证pq指针的合理性。因为我们要让队头元素出队,所以队列不能为空,当队列为空时,我们也使用assert()断言

出队其实就是进行单链表的头删操作,出队时我们也要分情况讨论:

(1)当队列只有一个结点时,我们直接释放掉这个结点(free(pq->head)),再让头指针head和尾指针tail置空。

(2)当队列不止一个结点时,我们定义一个结构体指针next保存头结点的下一个结点,用free()释放掉头结点,再让头指针head指向next指针。

最后我们让size--即可。

//出队
void QueuePop(Que* pq)
{assert(pq);//队列为空assert(!QueueEmpty(pq));//只有一个结点if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{QNode* next = pq->head->next;free(pq->head);pq->head = next;}pq->size--;
}

2.3.4 获取队头元素

首先使用assert()断言,保证pq指针的合理性。因为我们要获取队头元素,所以队列不能为空,当队列为空时,我们也使用assert()断言

返回头结点的值(head->data)即可。

//获取队头元素
QDataType QueueFront(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}

2.3.5 获取队尾元素

首先使用assert()断言,保证pq指针的合理性。因为我们要获取队尾元素,所以队列不能为空,当队列为空时,我们也使用assert()断言

返回尾结点的值(tail->data)即可。

//获取队尾元素
QDataType QueueBack(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}

2.3.6 获取队列中有效元素个数

assert()断言保证指针pq的合理性,直接返回size即可

//获取队列中有效元素个数
QDataType QueueSize(Que* pq)
{assert(pq);return pq->size;
}

2.3.7 检测队列是否为空

先用assert()断言保证指针pq的合理性。判断head是否为空并返回

//检测队列是否为空
bool QueueEmpty(Que* pq)
{assert(pq);return pq->head == NULL;
}

2.3.8 销毁队列

assert()断言保证指针pq的合理性。定义一个结构体指针cur遍历整个链表,依次free()释放掉每个结点。因为直接free释放当前的结点会导致找不到下一个结点,所以我们使用结构体指针next保存当前结点的下一个结点。通过while循环遍历,就能依次释放链表中的每个结点。

最后将头指针head尾指针tail置空。将队列长度size置为0

//销毁队列
void QueueDestroy(Que* 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;
}

2.4 队列的完整代码

2.4.1 Queue.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int QDataType;
typedef struct QueueNode
{QDataType data;struct QueueNode* next;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;int size;
}Que;//初始化队列
void QueueInit(Que* pq);
//入队
void QueuePush(Que* pq,QDataType x);
//出队
void QueuePop(Que* pq);
//获取队头元素
QDataType QueueFront(Que* pq);
//获取队尾元素
QDataType QueueBack(Que* pq);
//获取队列中有效元素个数
QDataType QueueSize(Que* pq);
//检测队列是否为空
bool QueueEmpty(Que* pq);
//销毁队列
void QueueDestroy(Que* pq);

2.4.2 Queue.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"//初始化队列
void QueueInit(Que* pq)
{assert(pq);pq->head = pq->tail = NULL;pq->size = 0;
}//入队
void QueuePush(Que* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc failed");exit(-1);}newnode->data = x;newnode->next = NULL;if (pq->tail == NULL){pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}//出队
void QueuePop(Que* pq)
{assert(pq);//队列为空assert(!QueueEmpty(pq));//只有一个结点if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{QNode* next = pq->head->next;free(pq->head);pq->head = next;}pq->size--;
}//获取队头元素
QDataType QueueFront(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}//获取队尾元素
QDataType QueueBack(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}//获取队列中有效元素个数
QDataType QueueSize(Que* pq)
{assert(pq);return pq->size;
}//检测队列是否为空
bool QueueEmpty(Que* pq)
{assert(pq);return pq->head == NULL;
}//销毁队列
void QueueDestroy(Que* 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;
}

2.4.3 Test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"void TestQueue()
{Que q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);QueuePush(&q, 3);QueuePush(&q, 4);QueuePush(&q, 5);while (!QueueEmpty(&q)){printf("%d ", QueueFront(&q));QueuePop(&q);}printf("\n");QueueDestroy(&q);
}
int main()
{TestQueue();return 0;
}

 

 

3. 总结

到这里,我们就用C语言实现了数据结构中的栈和队列。有什么问题欢迎在评论区讨论。如果觉得文章有什么不足之处,可以在评论区留言。如果喜欢我的文章,可以点赞收藏哦!

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

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

相关文章

堆 和 优先级队列(超详细讲解,就怕你学不会)

优先级队列 一、堆的概念特性二、堆的创建1、向下调整算法2、向下调整建堆3、向下调整建堆的时间复杂度 三、堆的插入1、向上调整算法实现插入2、插入创建堆的时间复杂度 三、堆的删除四、Java集合中的优先级队列1、PriorityQueue 接口概述及模拟实现2、如何创建大根堆&#xf…

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,containsKey)五(117)

需求&#xff1a;前端根据后端的返回数据&#xff1a;画统计图&#xff1b; 1.动态获取地域数据以及数据中的平均值&#xff0c;按照平均值降序排序&#xff1b; 说明&#xff1a; X轴是动态的&#xff0c;有对应区域数据则展示&#xff1b; X轴 区域数据降序排序&#xff1b;…

Intelij IDEA 配置Tomcat解决Application Server不显示的问题

今天搭建war工程时部署项目发现&#xff0c;IDEA的控制台没有Application Servers&#xff0c;在网上查了一下&#xff0c;总结几个比较好的解决方法&#xff0c;为了方便自己和其他人以后碰到相同的问题&#xff0c;不再浪费时间再次寻找解决办法。 Intelij IDEA 配置Tomcat时…

【Spring专题】Spring之Bean的生命周期源码解析——阶段二(二)(IOC之属性填充/依赖注入)

目录 前言阅读准备阅读指引阅读建议 课程内容一、依赖注入方式&#xff08;前置知识&#xff09;1.1 手动注入1.2 自动注入1.2.1 XML的autowire自动注入1.2.1.1 byType&#xff1a;按照类型进行注入1.2.1.2 byName&#xff1a;按照名称进行注入1.2.1.3 constructor&#xff1a;…

uniapp小程序实现上传图片功能,并显示上传进度

效果图&#xff1a; 实现方法&#xff1a; 一、通过uni.chooseMedia(OBJECT)方法&#xff0c;拍摄或从手机相册中选择图片或视频。 官方文档链接: https://uniapp.dcloud.net.cn/api/media/video.html#choosemedia uni.chooseMedia({count: 9,mediaType: [image,video],so…

【Django】无法从“django.utils.encoding”导入名称“force_text”

整晚处理 Django 的导入错误。 我将把它作为提醒&#xff0c;希望处于相同情况的人数会减少。 原因 某些软件包版本不支持Django 4 请看下表并决定Django和Python的版本 方案 如果出现难以响应&#xff0c;或者更改环境麻烦&#xff0c;请尝试以下操作 例如出现以下错误 …

【制作npm包2】了解 package.json 相关配置

制作npm包目录 本文是系列文章&#xff0c; 作者一个橙子pro&#xff0c;本系列文章大纲如下。转载或者商业修改必须注明文章出处 一、申请npm账号、个人包和组织包区别 二、了解 package.json 相关配置 三、 了解 tsconfig.json 相关配置 四、 api-extractor 学习 五、npm包…

(六)、深度学习框架中的算子

1、深度学习框架算子的基本概念 深度学习框架中的算子&#xff08;operator&#xff09;是指用于执行各种数学运算和操作的函数或类。这些算子通常被用来构建神经网络的各个层和组件&#xff0c;实现数据的传递、转换和计算。 算子是深度学习模型的基本组成单元&#xff0c;它们…

程序的DAC检查与LSM简介

程序的DAC检查 在Linux中&#xff0c;程序的DAC&#xff08;Discretionary Access Control&#xff0c;自主访问控制&#xff09;检查是指操作系统对程序执行期间对文件和资源的访问权限进行的检查。 Linux使用一种基于权限的访问控制模型&#xff0c;其中每个文件和资源都与…

Spark 图计算ONEID 进阶版

0、环境信息 本文采用阿里云maxcompute的spark环境为基础进行的&#xff0c;搭建本地spark环境参考搭建Windows开发环境_云原生大数据计算服务 MaxCompute-阿里云帮助中心 版本spark 2.4.5&#xff0c;maven版本大于3.8.4 ①配置pom依赖 详见2-1 ②添加运行jar包 ③添加配置信…

【Linux】IO多路转接——poll接口

目录 poll初识 poll函数 poll服务器 poll的优点 poll的缺点 poll初识 poll也是系统提供的一个多路转接接口。 poll系统调用也可以让我们的程序同时监视多个文件描述符上的事件是否就绪&#xff0c;和select的定位是一样的&#xff0c;适用场景也是一样的。 poll函数 po…

LC-将有序数组转换为二叉搜索树

LC-将有序数组转换为二叉搜索树 链接&#xff1a;https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/ 描述&#xff1a; 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索…

QT的mysql(数据库)最佳实践和常见问题解答

涉及到数据库&#xff0c;首先安利一个软件Navicat Premium&#xff0c;用来查询数据库很方便 QMysql驱动是Qt SQL模块使用的插件&#xff0c;用于与MySQL数据库进行通信。要编译QMysql驱动&#xff0c;您需要满足以下条件&#xff1a; 您需要安装MySQL的客户端库和开发头文件…

【LeetCode】字符串匹配

字符串匹配问题 常见的字符串匹配算法包括暴力匹配、 Knuth-Morris-Pratt 算法、Boyer-Moore算法、Sunday 算法等 解题 思路 1: 两个指针各指向两个字符串的起始位置,先判断,两个字符串的第一个字符是否相同,如果相同的话,则将两个指针往下移动,并且判断较短字符串的下一个字符…

el-table实现静态和动态合并单元格 以及内容显示的问题

实现效果图 <el-tablev-loading"loading":data"tableData"style"width: 100%":row-class-name"tableRowClassName"size"small"><el-table-column fixed label"序号" width"50"><el-tab…

[MySQL] — 数据类型和表的约束

目录 数据类型 数据类型分类 数值类型 tinyint类型 bit类型 小数类型 float decimal 字符串类型 char varchar char和varchar的区别 日期和时间类型 enum 和 set 表的约束 空属性 默认值 列描述 zeorfill 主键 创建表时在字段上指定主键 删除主键&#xff1a; 追…

Spring Bean的生命周期总结(包含面试题)

目录 一、Bean的初始化过程 1. 加载Spring Bean 2. 解析Bean的定义 3. Bean属性定义 4. BeanFactoryPostProcessor 扩展接口 5. 实例化Bean对象 6. Aware感知 7. 初始化方法 8. 后置处理 9. destroy 销毁 二、Bean的单例与多例模式 2.1 单例模式&#xff08;Sin…

Codeforces Round 893 (Div. 2)B题题解

文章目录 [The Walkway](https://codeforces.com/contest/1858/problem/B)问题建模问题分析1.分析所求2.如何快速计算每个商贩被去除后的饼干数量代码 The Walkway 问题建模 给定n个椅子&#xff0c;其中有m个位置存在商贩&#xff0c;在商贩处必须购买饼干吃&#xff0c;每隔…

由于找不到d3dx9_43.dll无法继续执行代码怎么解决

我们在安装PS&#xff0c;吃鸡等软件跟游戏的时候&#xff0c;有可能安装完之后出现以下问题&#xff08;特别是win7或者win8系统&#xff09; 错误&#xff1a; 打开PS或者吃鸡等游戏的时候出现这个错误&#xff1a;无法启动此程序&#xff0c;因为计算机中丢失d3dx9_43.dll。…

4. 软件开发的环境搭建

目录 1. 搭建环境 1.1 检查 JDK 1.2 检查 MySQL 数据库 1.3 检查 Maven 1.4 检查 GITEEGIT 1.5 安装插件 1.5.1 安装 Spring Boot Helper 1.5.2 安装 lombok 1.6 创建仓库 1.6.1 登录 GITEE 创建仓库并复制仓库地址 1.6.2 克隆到本地 1.7 创建工程 1.7.1 设置编码…