《数据结构》栈,队列,双向链表

目录

栈概念

顺序栈

链式栈(链表实现)

顺序栈和链式栈的区别是什么?

队列

队列概念

顺序队列

链式队列

双向链表


栈概念

  • 什么是栈?

只能在一端进行插入和删除数据的线性表(称为栈),把能进行插入和删除的这一端叫栈顶,另一端成为栈底。实现栈可以用顺序表实现(顺序栈),也可以用链表实现(链式栈)

  • 栈的特点

先进后出:first in last out FILO

后进先出:last in first out LIFO

顺序栈

  • 逻辑结构:线性结构
  • 存储结构:顺序存储
  • 定义一个结构体描述顺序栈的信息
typedef  int   datatype_t;
typedef struct
{
    datatypde_t *data;	//保存栈的地址(数组)
	int  top;			//保存栈顶数据的下标
    int  len;			//栈的大小
}seqstack_t,*seqstack_p;
栈的常用操作
#include <stdio.h>
#include <stdlib.h>

typedef int datatype_t;
typedef struct {
    datatype_t *data;   // 保存栈的地址(数组)
    int top;            // 保存栈顶数据的下标
    int len;            // 栈的大小
} seqstack_t, *seqstack_p;

// 1. 创建一个空栈
seqstack_p createStack(int size) {
    seqstack_p stack = (seqstack_p)malloc(sizeof(seqstack_t));
    if (stack == NULL) {
        printf("Failed to allocate memory for stack.\n");
        return NULL;
    }

    stack->data = (datatype_t*)malloc(size * sizeof(datatype_t));
    if (stack->data == NULL) {
        printf("Failed to allocate memory for stack data.\n");
        free(stack);
        return NULL;
    }

    stack->top = -1;
    stack->len = size;
    return stack;
}

// 2. 入栈
int push(seqstack_p stack, datatype_t value) {
    if (stack->top == stack->len - 1) {
        printf("Stack is full. Cannot push %d.\n", value);
        return 0;
    }
    stack->top++;
    stack->data[stack->top] = value;
    return 1;
}

// 3. 判断栈是否满
int isFull(seqstack_p stack) {
    return stack->top == stack->len - 1;
}

// 4. 出栈
int pop(seqstack_p stack, datatype_t *value) {
    if (stack->top == -1) {
        printf("Stack is empty. Cannot pop.\n");
        return 0;
    }

    *value = stack->data[stack->top];
    stack->top--;
    return 1;
}

// 5. 判断栈是否为空
int isEmpty(seqstack_p stack) {
    return stack->top == -1;
}

// 6. 求栈的长度
int stackLength(seqstack_p stack) {
    return stack->top + 1;
}

// 7. 获取栈顶的值
int getTop(seqstack_p stack, datatype_t *value) {
    if (stack->top == -1) {
        printf("Stack is empty. Cannot get top value.\n");
        return 0;
    }

    *value = stack->data[stack->top];
    return 1;
}

int main() {
    int size = 5;
    seqstack_p stack = createStack(size);
    if (stack == NULL) {
        return 1;
    }
    push(stack, 1);
    push(stack, 2);
    push(stack, 3);
    int topValue;
    if (getTop(stack, &topValue)) {
        printf("Top value: %d\n", topValue);
    }
    printf("Stack length: %d\n", stackLength(stack));
    while (!isEmpty(stack)) {
        int value;
        pop(stack, &value);
        printf("Pop value: %d\n", value);
    }
    free(stack->data);
    free(stack);
    return 0;
}

链式栈(链表实现)

  • 逻辑结构:线性结构
  • 存储结构:链式存储
  • 定义节点结构
typedef int datatype_t;
typedef struct node_t
{
	datatype_t data;		//数据
	struct node_t *next;	//节点
}linkstack_t,*linkstack_p;
  • 链式栈的操作
#include <stdio.h>
#include <stdlib.h>

typedef int datatype_t;
typedef struct node_t {
    datatype_t data;
    struct node_t* next;
} linkstack_t, *linkstack_p;

// 1. 创建一个空的栈
linkstack_p createStack() {
    linkstack_p stack = (linkstack_p)malloc(sizeof(linkstack_t));
    if (stack == NULL) {
        printf("Failed to allocate memory for stack.\n");
        return NULL;
    }

    stack->next = NULL;
    return stack;
}

// 2. 入栈
void push(linkstack_p stack, datatype_t value) {
    linkstack_p newNode = (linkstack_p)malloc(sizeof(linkstack_t));
    if (newNode == NULL) {
        printf("Failed to allocate memory for new node.\n");
        return;
    }

    newNode->data = value;
    newNode->next = stack->next;
    stack->next = newNode;
}

// 3. 判断栈是否为空
int isEmpty(linkstack_p stack) {
    return stack->next == NULL;
}

// 4. 出栈
datatype_t pop(linkstack_p stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty. Cannot pop.\n");
        return NULL;
    }

    linkstack_p temp = stack->next;
    datatype_t value = temp->data;
    stack->next = temp->next;
    free(temp);

    return value;
}

// 5. 清空栈
void clearStack(linkstack_p stack) {
    while (!isEmpty(stack)) {
        pop(stack);
    }
}

// 6. 求栈的长度
int stackLength(linkstack_p stack) {
    int count = 0;
    linkstack_p p = stack->next;
    while (p != NULL) {
        count++;
        p = p->next;
    }
    return count;
}

// 7. 获取栈顶的值
datatype_t getTop(linkstack_p stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty. Cannot get top value.\n");
        return NULL;
    }

    return stack->next->data;
}

int main() {
    linkstack_p stack = createStack();
    push(stack, 1);
    push(stack, 2);
    push(stack, 3);
    printf("Stack length: %d\n", stackLength(stack));
    datatype_t topValue = getTop(stack);
    printf("Top value: %d\n", topValue);
    while (!isEmpty(stack)) {
        datatype_t value = pop(stack);
        printf("Pop value: %d\n", value);
    }
    clearStack(stack);
    free(stack);
    return 0;
}

顺序栈和链式栈的区别是什么?

(1)顺序栈的存储结构是顺序存储,链式栈的存储结构是链式存储

(2)顺序栈的长度受限制,而链栈不会

队列

队列概念

  • 什么是队列?

只允许在两端进行插入删除操作的线性表,在队尾插入,插入数据的这一端,被称为"队尾",删除的一端被称为"队头"。实现队列的方式有两种:顺序队列 链式队列

  • 队列特点

先进先出、后进后出 FIFO LILO

顺序队列

  • 逻辑结构:线性结构
  • 存储结构:顺序结构
  • 定义顺序队列的结构体
#define N 6
typedef int  datatype_t;
typedef struct 
{
    datatype_t  data[N];//顺序表定义的队
    int front;			//队头下标
    int  rear;			//队尾下标
}sequeue_t;  
顺序队列基础操作
#include <stdio.h>
#include <stdlib.h>

#define N 6
typedef int datatype_t;
typedef struct {
    datatype_t data[N]; // 顺序表定义的队
    int front; 			// 队头下标
    int rear; 			// 队尾下标
} sequeue_t;

// 1. 创建一个空的顺序队列
sequeue_t* createQueue() {
    sequeue_t* queue = (sequeue_t*)malloc(sizeof(sequeue_t));
    if (queue == NULL) {
        printf("Failed to allocate memory for queue.\n");
        return NULL;
    }
    queue->front = 0;
    queue->rear = 0;
    return queue;
}

// 2. 入队
void enqueue(sequeue_t* queue, datatype_t value) {
    if ((queue->rear + 1) % N == queue->front) {	
        printf("Queue is full. Cannot enqueue.\n");
        return;
    }

    queue->data[queue->rear] = value;
    queue->rear = (queue->rear + 1) % N;
}

// 3. 判断队列是否满
int isFull(sequeue_t* queue) {
    return (queue->rear + 1) % N == queue->front;
}

// 4. 出队
datatype_t dequeue(sequeue_t* queue) {
    if (queue->front == queue->rear) {
        printf("Queue is empty. Cannot dequeue.\n");
        return NULL;
    }

    datatype_t value = queue->data[queue->front];
    queue->front = (queue->front + 1) % N;
    return value;
}

// 5. 判断队列是否为空
int isEmpty(sequeue_t* queue) {
    return queue->front == queue->rear;
}

// 6. 计算队列的长度
int queueLength(sequeue_t* queue) {
    return (queue->rear - queue->front + N) % N;
}

// 7. 清空队列
void clearQueue(sequeue_t* queue) {
    queue->front = queue->rear;
}

int main() {
    sequeue_t* queue = createQueue();

    enqueue(queue, 1);
    enqueue(queue, 2);
    enqueue(queue, 3);

    printf("Queue length: %d\n", queueLength(queue));

    while (!isEmpty(queue)) {
        datatype_t value = dequeue(queue);
        printf("Dequeued value: %d\n", value);
    }

    if (isEmpty(queue)) {
        printf("Queue is empty.\n");
    }

    clearQueue(queue);
    free(queue);

    return 0;
}

链式队列

  • 逻辑结构:线性结构
  • 存储结构:链式存储
  • 定义节点结构体
typedef   int  datatype;
typedef struct  node_t
{
	datatype data;	//数据域
	struct node_t *next;
}link_t;

//保存头尾节点地址结构体:
typedef struct
{
	link_t *front;	//头指针
	link_t *rear;	//尾指针
	int len;		//保存队列的长度(个数)
}queue_t;
  • 链式队列的操作
#include <stdio.h>
#include <stdlib.h>

typedef int datatype;

typedef struct node_t {
    datatype data;          // 数据域
    struct node_t *next;    // 指向下一个节点的指针
} link_t;

typedef struct {
    link_t *front;          // 头指针
    link_t *rear;           // 尾指针
    int len;                // 队列长度
} queue_t;

// 创建空队列
void createQueue(queue_t *queue) {
    queue->front = NULL;
    queue->rear = NULL;
    queue->len = 0;
}

// 入队
void enqueue(queue_t *queue, datatype data) {
    link_t *newNode = (link_t*)malloc(sizeof(link_t));
    newNode->data = data;
    newNode->next = NULL;

    if (queue->rear == NULL) {
        queue->front = newNode;
        queue->rear = newNode;
    } else {
        queue->rear->next = newNode;
        queue->rear = newNode;
    }

    queue->len++;
}

// 出队
datatype dequeue(queue_t *queue) {
    if (queue->front == NULL) {
        printf("Queue is empty.\n");
        return -1; // 用-1表示队列为空的情况
    }

    link_t *temp = queue->front;
    datatype data = temp->data;

    queue->front = queue->front->next;
    free(temp);

    if (queue->front == NULL) {
        queue->rear = NULL;
    }

    queue->len--;

    return data;
}

// 判断队列是否为空
int isQueueEmpty(queue_t *queue) {
    return (queue->front == NULL);
}

// 清空队列
void clearQueue(queue_t *queue) {
    while (queue->front != NULL) {
        link_t *temp = queue->front;
        queue->front = queue->front->next;
        free(temp);
    }

    queue->rear = NULL;
    queue->len = 0;
}

// 计算队列的长度
int getQueueLength(queue_t *queue) {
    return queue->len;
}

int main() {
    queue_t queue;
    createQueue(&queue);

    // 测试入队
    enqueue(&queue, 10);
    enqueue(&queue, 20);
    enqueue(&queue, 30);

    // 测试出队
    printf("Dequeued element: %d\n", dequeue(&queue));

    // 测试判断队列是否为空
    if (isQueueEmpty(&queue)) {
        printf("Queue is empty.\n");
    } else {
        printf("Queue is not empty.\n");
    }

    // 测试清空队列
    clearQueue(&queue);

    // 测试计算队列的长度
    printf("Queue length: %d\n", getQueueLength(&queue));

    return 0;
}

双向链表

  • 逻辑结构:线性结构
  • 存储结构:链式存储
  • 保存数据的结构体
typede int  datatype;

typedef struct node_t
{
	datatype data;			//数据域
	struct node_t *prior;	//保存前一个节点的地址
	struct node_t *next;	//保存后一个节点地址
}link_t;

//用于保存双向链表信息的结构体:
typedef struct
{
    link_t *head;	//保存头节点地址
	link_t *tail;	//保存尾节点的地址
	int len;		//保存双向链表的长度
}double_t;
  • 双向链表的操作
#include <stdio.h>
#include <stdlib.h>

typedef int datatype;

typedef struct node_t {
    datatype data;          // 数据域
    struct node_t *prior;   // 前一个节点的指针
    struct node_t *next;    // 后一个节点的指针
} link_t;

typedef struct {
    link_t *head;           // 头节点的指针
    link_t *tail;           // 尾节点的指针
    int len;                // 双向链表的长度
} double_t;

// 创建一个空的双向链表
void createDoubleList(double_t *list) {
    list->head = NULL;
    list->tail = NULL;
    list->len = 0;
}

// 向双向链表的指定位置插入数据
void insertData(double_t *list, int pos, datatype data) {
    if (pos < 0 || pos > list->len) {
        printf("Invalid position.\n");
        return;
    }

    link_t *newNode = (link_t*)malloc(sizeof(link_t));
    newNode->data = data;

    if (pos == 0) {
        newNode->prior = NULL;
        newNode->next = list->head;

        if (list->head != NULL) {
            list->head->prior = newNode;
        }

        list->head = newNode;

        if (list->tail == NULL) {
            list->tail = newNode;
        }
    } else if (pos == list->len) {
        newNode->prior = list->tail;
        newNode->next = NULL;

        if (list->tail != NULL) {
            list->tail->next = newNode;
        }

        list->tail = newNode;
    } else {
        link_t *current = list->head;
        int i = 0;

        while (i < pos) {
            current = current->next;
            i++;
        }

        newNode->prior = current->prior;
        newNode->next = current;

        current->prior->next = newNode;
        current->prior = newNode;
    }

    list->len++;
}

// 遍历双向链表
void traverseList(double_t *list) {
    link_t *current = list->head;

    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }

    printf("\n");
}

// 删除双向链表指定位置的数据
void deleteData(double_t *list, int pos) {
    if (pos < 0 || pos >= list->len) {
        printf("Invalid position.\n");
        return;
    }

    link_t *current = list->head;

    if (pos == 0) {
        list->head = current->next;

        if (list->head != NULL) {
            list->head->prior = NULL;
        }

        if (list->tail == current) {
            list->tail = NULL;
        }
    } else if (pos == list->len - 1) {
        current = list->tail;
        list->tail = current->prior;
        list->tail->next = NULL;
    } else {
        int i = 0;

        while (i < pos) {
            current = current->next;
            i++;
        }

        current->prior->next = current->next;
        current->next->prior = current->prior;
    }

    free(current);
    list->len--;
}

// 判断双向链表是否为空
int isDoubleListEmpty(double_t *list) {
    return (list->head == NULL);
}

// 求双向链表的长度
int getDoubleListLength(double_t *list) {
    return list->len;
}

// 查找指定数据出现的位置
int findDataPosition(double_t *list, datatype data) {
    link_t *current = list->head;
    int pos = 0;

    while (current != NULL) {
        if (current->data == data) {
            return pos;
        }

        current = current->next;
        pos++;
    }

    return -1; // 表示未找到数据
}

// 修改指定位置的数据
void modifyData(double_t *list, int pos, datatype newData) {
    if (pos < 0 || pos >= list->len) {
        printf("Invalid position.\n");
        return;
    }

    link_t *current = list->head;
    int i = 0;

    while (i < pos) {
        current = current->next;
        i++;
    }

    current->data = newData;
}

// 删除双向链表中的指定数据
void deleteDataByValue(double_t *list, datatype data) {
    int pos = findDataPosition(list, data);

    if (pos != -1) {
        deleteData(list, pos);
    } else {
        printf("Data not found.\n");
    }
}

// 转置双向链表
void reverseList(double_t *list) {
    if (list->len <= 1) {
        return;
    }

    link_t *current = list->head;
    link_t *temp = NULL;

    while (current != NULL) {
        temp = current->prior;
        current->prior = current->next;
        current->next = temp;

        current = current->prior;
    }

    temp = list->head;
    list->head = list->tail;
    list->tail = temp;
}

int main() {
    double_t list;
    createDoubleList(&list);

    // 测试向双向链表的指定位置插入数据
    insertData(&list, 0, 10);
    insertData(&list, 1, 20);
    insertData(&list, 2, 30);

    // 测试遍历双向链表
    traverseList(&list);

    // 测试删除双向链表指定位置的数据
    deleteData(&list, 1);

    // 测试判断双向链表是否为空
    if (isDoubleListEmpty(&list)) {
        printf("Double linked list is empty.\n");
    } else {
        printf("Double linked list is not empty.\n");
    }

    // 测试求双向链表的长度
    printf("Double linked list length: %d\n", getDoubleListLength(&list));

    // 测试查找指定数据出现的位置
    int pos = findDataPosition(&list, 20);
    if (pos != -1) {
        printf("Data found at position: %d\n", pos);
    } else {
        printf("Data not found.\n");
    }

    // 测试修改指定位置的数据
    modifyData(&list, 0, 50);

    // 测试删除双向链表中的指定数据
    deleteDataByValue(&list, 30);

    // 测试转置双向链表
    reverseList(&list);

    // 再次遍历双向链表
    traverseList(&list);

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Fatdog64 Linux 814发布

导读Fatdog64 Linux是一个小型、桌面、64位的Linux发行版。 最初是作为Puppy Linux的衍生品&#xff0c;并增加了一些应用程序。该项目最新的版本&#xff0c;Fatdog64 814&#xff0c;是8xx系列的最后一个版本&#xff0c;未来的版本将转向9xx基础。 尽管它是该系列的最后一个…

【Ranking】50 Matplotlib Visualizations, Python实现,源码可复现

详情请参考博客: Top 50 matplotlib Visualizations 因编译更新问题&#xff0c;本文将稍作更改&#xff0c;以便能够顺利运行。 1 Ordered Bar Chart 有序条形图有效地传达项目的排名顺序。但是&#xff0c;将图表上方的指标值相加&#xff0c;用户将从图表本身获得准确的信息…

网络安全合规与标准的主要发展方向

网络安全合规就是避免违反网络安全有关的法律、法规、规章、合同义务以及任何安全要求&#xff0c;标准在网络安全合规工作中扮演着重要的角色。 一、标准在网络安全合规体系中的地位作用 网络安全合规体系包括网络安全有关的法律、法规、规章、其他规范性文件、及合同义务等…

[java安全]TemplatesImpl在Shiro550反序列化

文章目录 【java安全】TemplatesImpl在Shiro550反序列化Shiro的原理Shiro反序列化产生演示攻击过程payload使用key加密 构造不含数组的GadGets简单调用链 改造cc6为CommonsCollctionsShiro完整POC触发Shiro550漏洞进阶POC总结 【java安全】TemplatesImpl在Shiro550反序列化 Sh…

24.实现线性拟合和相关系数(matlab程序)

1.简述 1. 基本语法 1.1 corr函数基本语法 语法 说明 rho corr(X) 返回输入矩阵X中每对列之间的两两线性相关系数矩阵。 rho corr(X, Y) 返回输入矩阵X和Y中每对列之间的两两相关系数矩阵。 [rho, pval] corr(X, Y) 返回pval&#xff0c;一个p值矩阵&#xff0c…

OceanBase 压测时为什么冻结阈值在变化?

本文从源码角度分析了 OceanBase 压测中冻结阈值动态变化的原因&#xff0c;并给出运维建议。 作者&#xff1a;张乾 外星人2号&#xff0c;兼任五位喵星人的铲屎官。 本文来源&#xff1a;原创投稿 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转…

Vue3组合式API+TypeScript写法入门

文章目录 前言1.reactive2.ref3.props4.computed5.emit6.watch总结 前言 参考Vue3官网. 本篇以组合式API为例, 但不包含setup语法糖式写法. 原本打算结合class-component, Vue3不推荐就不用了: OverView|Vue Class Component. 而且是不再推荐基于类的组件写法, 推荐单文件组件…

NetSuite ERP顾问的进阶之路

目录 1.修养篇 1.1“道”是什么&#xff1f;“器”是什么&#xff1f; 1.2 读书这件事儿 1.3 十年计划的力量 1.3.1 一日三省 1.3.2 顾问损益表 1.3.3 阶段课题 2.行为篇 2.1协作 2.2交流 2.3文档管理 2.4时间管理 3.成长篇 3.1概念能力 3.1.1顾问的知识结构 …

【idea】idea全局设置Maven配置

Idea版本&#xff1a;2021.1.1 1、点击File->Close project 2、点击Customize->All settings 3、设置Maven

Vue 项目增加版本号输出, 可用于验证是否更新成功

webpack 1. vue.config.js 中增加以下配置, 此处以增加一个日期时间字符串为例, 具体内容可以根据自己需求自定义 // vue.config.js module.exports {chainWebpack(config) {config.plugin(define).tap(args > {args[0][process.env].APP_VERSION ${JSON.stringify(new …

Vue中TodoLists案例_删除

与上一篇Vue中TodoList案例_勾选有三个文件变化了 App.vue&#xff1a;添加了一个deleteTodo根据id删除方法&#xff0c;传递给儿子组件MyList <template><div id"root"><div class"todo-container"><div class"todo-wrap"…

浅谈小程序开源业务架构建设之路

一、业务介绍 1.1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态&#xff0c;我们的愿景是&#xff1a;定义移动时代最佳体验&#xff0c;建设智能小程序行业标准&#xff0c;打破孤岛&#xff0c;共建开源、开放、繁荣的小程序行业生态。百度…

脑电信号处理与特征提取——三. 脑电实验设计的原理与实例(古若雷)

三、脑电实验设计的原理与实例 被试间设计的实验结果也有可能是人员不同造成的&#xff0c;所以建议被试内设计。

Web前端开发概述(二)

&#x1f60a;Web前端开发概述&#xff08;二&#xff09; &#x1f47b;前言&#x1fa81;前端开发背景&#x1f50d;当下前端开发要求&#x1f526;Web前端开发技术&#x1f3ad;HTML&#x1f3ad;CSS&#x1f3ad;JavaScript&#x1f3ad;HTML DOM&#x1f3ad;BOM&#x1f…

JVM面试题总结

一.请简述对象的创建过程 对象的new字节码执行指令如下图 首先0指令new出一片内存空间&#xff0c;然后进行对象的初始化&#xff0c;初始化完成前变量都是初始值如m0 然后创建连接&#xff0c;t指向对象。 二.DCL单例要不要加volatile&#xff1f; DCL单例就是要懒汉式从创建…

软工导论知识框架(一)软件工程学概述

本贴为B站大连工业大学老师的网课笔记&#xff0c;教材为张海藩第6版&#xff0c;适用于考研和期末复习。 导图比较拥挤&#xff0c;看不清可以单独保存或者放大页面。 一.软件&#xff1a; 软件指的是计算机程序、文档运行程序必须的数据、方法与规则。 方法指的是软件开发…

Java之集合的排序方式(Comparable和Comparator的基本使用以及区别)

文章目录 一、Comparable接口&#xff1a;1. 代码示例&#xff1a;2. 运行结果&#xff1a;3. 案例分析&#xff1a; 二、Comparator接口&#xff1a;1. 代码示例&#xff1a;2. 运行结果&#xff1a;3. 案例分析&#xff1a; 三、Comparable和Comparator对比&#xff1a;1. 接…

文心一言 VS 讯飞星火 VS chatgpt (64)-- 算法导论6.5 3题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;64&#xff09;-- 算法导论6.5 3题 三、要求用最小堆实现最小优先队列&#xff0c;请写出 HEAP-MINIMUM、HEAP-EXTRACT-MIN、HEAP DECREASE-KEY 和 MIN-HEAP-INSERT 的伪代码。 文心一言&#xff1a; 以下是使用最小堆实现最小…

UE5 AI移动无动作问题

文章目录 问题背景解决方法问题背景 在使用行为树让角色移动时,出现角色行走不播放动作的情况: 解决方法 其实有2个问题导致出现这种情况 1、角色动画蓝图的问题 角色动画蓝图可能存在4个问题: ① 无播放行走动画 ② 速度的值未正常传递 ③ 播放移动动作逻辑的值判断错…

qt与opencv学习记录

qtopencv开发入门&#xff1a;4步搞定环境配置-1_哔哩哔哩_bilibili qtopencv开发入门&#xff1a;4步搞定opencv环境配置2_哔哩哔哩_bilibili 文章内容来自上面两个视频&#xff0c;感谢创作者。 ps&#xff1a;配置环境的过程中&#xff0c;遇到了很多问题&#xff0c;我…
最新文章