【数据结构】栈、队列和数组

顺序栈

#define MaxSize 50
typedef struct
{
    int data[MaxSize];
    int top;
} SqStack;

// 1.(S.top == -1)
void InitStack(SqStack &S)
{
    S.top = -1;
}

// 2.(S.top == -1)
bool Push(SqStack &S, int x)
{
    if (S.top = MaxSize - 1)
        return false;
    S.data[++S.top] = x;
    return true;
}

// 3.(S.top == -1)
bool GetTop(SqStack &S, int &x)
{
    if (S.top == -1)
        return false;
    x = S.data[S.top];
    return true;
}

// 4. (S.top == -1)
bool StackEmpty(SqStack &S)
{
    if (S.top == -1)
        return true;
    return false;
}

// 5.(S.top == -1)
bool Pop(SqStack *S, int &x)
{
    if (S->top == -1)
        return false;
    x = S->data[S->top--];
    return true;
}

// // 1.(S.top == 0)
// void InitStack(SqStack &S)
// {
//     S.top = 0;
// }

// // 2.(S.top == 0)
// bool Push(SqStack &S, int x)
// {
//     if (S.top = MaxSize)
//         return false;
//     S.data[S.top++] = x;
//     return true;
// }

// // 3.(S.top == 0)
// bool GetTop(SqStack &S, int &x)
// {
//     if (S.top == 0)
//         return false;
//     x = S.data[S.top];
//     return true;
// }

// // 4. (S.top == 0)
// bool StackEmpty(SqStack &S)
// {
//     if (S.top == 0)
//         return true;
//     return false;
// }

// // 5.(S.top == 0)
// bool Pop(SqStack *S, int &x)
// {
//     if (S->top == 0)
//         return false;
//     x = S->data[--S->top];
//     return true;
// }

链栈

typedef struct LinkNode
{
    int data;
    struct LinkNode *next;
} LiStack;

共享栈

#define MaxSize 50
typedef struct
{
    int data[MaxSize];
    int top0;
    int top1;
} ShStack;

void InitStack(ShStack &S)
{
    S.top0 = -1;
    S.top1 = MaxSize;
}

队列

循环队列

#define MaxSize 50
typedef struct
{
    int data[MaxSize];
    int front, rear;
} SqQueue;

// 1.初始化
void InitQueue(SqQueue &Q)
{
    Q.rear = Q.front = 0;
}

// 2.循环队列入队
bool EnEmmpty(SqQueue &Q, int x)
{
    if ((Q.rear + 1) % MaxSize == Q.front)
        return false;
    Q.data[Q.rear] = x;
    Q.rear = (Q.rear + 1) % MaxSize;
    return true;
}

// 3.判断队列为空
bool isEmpty(SqQueue &Q)
{
    if (Q.rear == Q.front)
        return true;
    return false;
}

// 4. 循环队列出队
bool DeEmpty(SqQueue &Q, int &x)
{
    if (Q.rear == Q.front)
        return false;
    x = Q.data[Q.front];
    Q.front = (Q.front + 1) % MaxSize;
    return true;
}

// 5. 获取队头元素值
bool Gethead(SqQueue Q, int &x)
{
    if (Q.rear == Q.front)
        return false;
    x = Q.data[Q.front];
    return true;
}

带头结点的链式队列

typedef struct LinkNode
{
    int data;
    struct LinkNode *next;
} LinkNode;

typedef struct
{
    LinkNode *front, *rear;
} LinkNode;

// 带头结点的实现方式

// 1.初始化
void InitQueue(LinkNode &Q)
{
    Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode));
    Q.front->next = NULL;
}

// 2.判断是否为空
bool isEmpty(LinkNode &Q)
{
    if (Q.front == Q.rear)
        return true;
    return false;
}

// 3.入队
bool EnEmpty(LinkNode &Q, int x)
{
    LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
    s->data = x;
    s->next = NULL;
    Q.rear->next = s;
    Q.rear = s;
    return true;
}

// 4.出队
bool DeEmpty(LinkNode &Q, int &x)
{
    if (Q.rear == Q.front)
        return false;
    LinkNode *p = Q.front->next;
    x = p->data;
    Q.front->next = Q.front->next->next;
    if (Q.rear == p)
        Q.rear = Q.front;
    free(p);
    return true;
}

不带头结点的链式队列

typedef struct LinkNode
{
    int data;
    struct LinkNode *next;
} LinkNode;

typedef struct
{
    LinkNode *front, *rear;
} LinkNode;

//  不带头结点的实现方式

// 1.初始化
void InitQueue(LinkNode &Q)
{
    Q.front = Q.rear = NULL;
}

// 2.判断是否为空
bool isEmpty(LinkNode &Q)
{
    if (Q.front == NULL)
        return true;
    return false;
}

// 3.入队
bool EnEmpty(LinkNode &Q, int x)
{
    LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
    s->data = x;
    s->next = NULL;
    if (Q.front == NULL)
    {
        Q.front = s;
        Q.rear = s;
    }
    else
    {
        Q.rear->next = s;
        Q.rear = s;
    }
    return true;
}

// 4.出队
bool DeEmpty(LinkNode &Q, int &x)
{
    if (Q.rear == NULL)
        return false;
    LinkNode *p = Q.front;
    x = p->data;
    Q.front = p->next;
    if (Q.rear == p)
    {
        Q.rear = NULL;
        Q.front = NULL;
    }
    free(p);
    return true;
}

顺序串

#define MAXSIZE 50
// 静态分配
typedef struct
{
    char str[MAXSIZE];
    int length;
} SeqString;

// 1.
void StrAssign(SeqString *S, char cstr[])
{
    int i = 0;
    for (i = 0; cstr[i] != '\0'; i++)
    {
        S->str[i] = cstr[i];
    }
    S->length = i;
}

// 2.
int StrEmpty(SeqString S)
{
    if (S.length == 0)
        return 1;
    return 0;
}

// 3.
int StrLength(SeqString S)
{
    return S.length;
}

// 4.
void StrCopy(SeqString *T, SeqString S)
{
    int i = 0;
    for (i = 0; i < S.length; i++)
    {
        T->str[i] = S.str[i];
    }
    T->length = S.length;
}

// 5. 比较两个串的大小
int StrCompare(SeqString S, SeqString T)
{
    int i;
    for (i = 0; i < S.length && i < T.length; i++)
    {
        if (S.str[i] == T.str[i])
            return (S.str[i] - T.str[i]);
    }
    return (S.length - T.length);
}

// 6. 在串S的第pos位置插入串T。若成功,返回1;失败,返回0
int StrInsert(SeqString *S, int pos, SeqString T)
{
    int i;
    if (pos < 0 || pos >= S->length)
    {
        printf("插入位置错误");
        return 0;
    }
    if (S->length + T.length <= MAXSIZE)
    {
        for (i = S->length + T.length - 1; i >= pos + T.length - 1; i--)
            S->str[i] = S->str[i - T.length];
        for (i = 0; i < T.length; i++)
            S->str[pos + i] = T.str[i];
        S->length += T.length;
        return 1;
    }
    else if (pos + T.length <= MAXSIZE) // 子串可以完整插入S中,但是S中的字符会被截掉
    {
        for (i = MAXSIZE - 1; i > T.length + pos - 1; i--)
            S->str[i] = S->str[i - T.length];
        for (i = 0; i < T.length; i++)
            S->str[i + pos - 1] = T.str[i];
        S->length = MAXSIZE;
        return 0;
    }
    else // 子串T不能被完全插入S中,T中会有字符被舍弃
    {
        for (i = 0; i < MAXSIZE - pos; i++)
            S->str[i + pos - 1] = T.str[i];
        S->length = MAXSIZE;
        return 0;
    }
}

// 7. 删除串S中pos开始的len个字符
int StrDelete(SeqString *S, int pos, int len)
{
    int i;
    if (pos < 0 || len < 0 || pos + len - 1 > S->length)
        return 0;
    else
    {
        for (i = pos + len - 1; i <= S->length - 1; i++)
            S->str[i - len] = S->str[i];
        S->length -= len;
        return 1;
    }
}

// 8.将串S连接到串T的末尾
int StrConcat(SeqString *T, SeqString S)
{
    int i, flag;
    if (T->length + S.length <= MAXSIZE)
    {
        for (i = T->length; i < T->length + S.length; i++)
            T->str[i] = S.str[i - S.length];
        T->length += S.length;
        flag = 1; // S完整连接到T后面
    }
    else if (T->length <= MAXSIZE)
    {
        for (i = T->length; i < MAXSIZE; i++)
            T->str[i] = S.str[i - T->length];
        T->length = MAXSIZE;
        flag = 0;
    }
    return flag;
}

// 9. 清空串
void StrClear(SeqString *S)
{
    S->length = 0;
}

模式匹配KMP

// 模式匹配KMP
void get_next(SeqString T, int next[])
{
    int i = 1, j = 0;
    next[1] = 0;
    while (i < T.length)
    {
        if (j == 0 || T.str[i] == T.str[j])
        {
            ++i;
            ++j;
            next[i] = j;
        }
        else
        {
            j = next[j];
        }
    }
}

int Index_KMP(SeqString S, SeqString T, int next[])
{
    int i = 1, j = 1;
    while (i <= S.length && j <= T.length)
    {
        if (j == 0 || S.str[i] == T.str[j])
        {
            ++i;
            ++j;
        }
        else
            j = next[j];
    }
    if (j > T.length) // 匹配成功
        return i - T.length;
    return 0;
}

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

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

相关文章

GPG error golang 1.19

1. 问题描述及原因分析 在飞腾2000的服务器&#xff0c;OS为Kylin Linux Advanced Server release V10环境下&#xff0c;docker版本为18.09.0&#xff08;docker-engine-18.09.0-101.ky10.aarch64&#xff09;&#xff0c;基于容器镜像golang:1.19编译新的容器镜像&#xff0…

C++黑暗迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> #include <cstdlib> #include <ctime> using namespace std; struct near {int i;int ia;int ix;int iy;int iwalk; }; v…

22.1 k8s不同role级别的服务发现

本节重点介绍 : 服务发现的应用3种采集的k8s服务发现role 容器基础资源指标 role :nodek8s服务组件指标 role :endpoint部署在pod中业务埋点指标 role :pod 服务发现的应用 所有组件将自身指标暴露在各自的服务端口上&#xff0c;prometheus通过pull过来拉取指标但是promet…

SQL中基本SELECT语句及常见关键字的使用(内连接,左/右连接)

这里写目录标题 SQL中基本SELECT语句的使用SQL语法简介DDL、DML、DCLSEECT SELECT常用关键词group by分组having筛选limit限定条数UION和UION ALL合并SQL执行顺序 联表查询多表查询示例特殊用法&#xff1a;笛卡尔积&#xff08;交叉连接&#xff09;等值连接vs非等值连接自连接…

VScode 自定义代码配色方案

vscode是一款高度自定义配置的编辑器, 我们来看看如何使用它自定义配色吧 首先自定义代码配色是什么呢? 看看我的代码界面 简而言之, 就是给你的代码的不同语义(类名, 函数名, 关键字, 变量)等设置不同的颜色, 使得代码的可读性变强. 其实很多主题已经给出了定制好的配色方案…

D3.js中国地图可视化

1、项目介绍 该项目来自Github&#xff0c;基于D3.js中国地图可视化。 D3.js is a JavaScript library for manipulating documents based on data. It uses HTML, SVG, and CSS to display data. The full name of D3 is "Data-Driven Documents," which means it a…

【Flume Kafaka实战】Using Kafka with Flume

一 目标 在Cloudera Manager中创建两个Flume的Agent&#xff0c;Agent1从local file中获取内容&#xff0c;写入到kafka的队列中。Agent2以Agent1的sink作为source&#xff0c;将数据从kafka中读取出来&#xff0c;写入到HDFS中。 二 实战 2.1 Kafka Sink 第一步&#xff0…

828华为云征文|部署多功能集成的协作知识库 AFFiNE

828华为云征文&#xff5c;部署多功能集成的协作知识库 AFFiNE 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 AFFiNE3.1 AFFiNE 介绍3.2 AFFiNE 部署3.3 AFFiNE 使用 四、…

Nginx基础详解5(nginx集群、四七层的负载均衡、Jmeter工具的使用、实验验证集群的性能与单节点的性能)

续Nginx基础详解4&#xff08;location模块、nginx跨域问题的解决、nginx防盗链的设计原理及应用、nginx模块化解剖&#xff09;-CSDN博客 目录 14.nginx集群&#xff08;前传&#xff09; 14.1如何理解单节点和集群的概念 14.2单节点和集群的比较 14.3Nginx中的负载均衡…

StopWath,apache commons lang3 包下的一个任务执行时间监视器的使用

StopWath是 apache commons lang3 包下的一个任务执行时间监视器&#xff0c;与我们平时常用的秒表的行为比较类似&#xff0c;我们先看一下其中的一些重要方法&#xff1a; <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependen…

过渡到内存安全语言:挑战和注意事项

开放源代码安全基金会 ( OpenSSF )总经理 Omkhar Arasaratnam 讨论了内存安全编程语言的演变及其为应对 C 和 C 等语言的局限性而出现的现象。 内存安全问题已存在五十多年&#xff0c;它要求程序员从内存管理任务中抽离出来。 Java、Rust、Python 和 JavaScript 等现代语言通…

八大排序详解

文章目录 目录1. 排序的概念及其运用1.1 排序的概念1.2 排序的运用1.3 常见的排序算法 2. 常见排序算法的实现2.1 插入排序2.1.1 基本思想2.1.2 直接插入排序2.1.3 希尔排序 2.2 选择排序2.2.1 基本思想2.2.2 直接选择排序2.2.3 堆排序 2.3 交换排序2.3.1 基本思想2.3.2 冒泡排…

SSL VPN | Easyconnect下载安装使用 (详尽)

EasyConnect是一款远程连接工具&#xff0c;为用户提供简便、快捷的远程访问和控制解决方案。 目录 下载 安装 使用 卸载 下载 通过链接进入官网技术支持板块 深信服技术支持-简单、高效、自助化服务 (sangfor.com.cn)https://support.sangfor.com.cn/ 选择软件下载 在安…

【C语言】指针篇 | 万字笔记

写在前面 在学习C语言过程&#xff0c;总有一个要点难点离不开&#xff0c;那就是大名鼎鼎的C语言指针&#xff0c;也是应为有指针的存在&#xff0c;使得C语言一直长盛不衰。因此不才把指针所学的所有功力都转换成这个笔记。希望对您有帮助&#x1f970;&#x1f970; 学习指…

【2025】基于Hadoop短视频流量数据分析与可视化(源码+文档+调试+答疑)

文章目录 前言一、主要技术&#xff1f;二、项目内容1.整体介绍&#xff08;示范&#xff09;2.运行截图3.部分代码介绍 总结更多项目 前言 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&am…

unix中的exec族函数介绍

一、前言 本文将介绍unix中exec族函数&#xff0c;包括其作用以及使用方法。当一个进程调用fork函数创建一个新进程后&#xff0c;新进程可以直接执行原本正文段的其他内容&#xff0c;但更多时候&#xff0c;我们在一个进程中调用fork创建新的进程后&#xff0c;希望新进程能…

杭州电子科技大学《2019年+2023年861自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《杭州电子科技大学861自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2019年真题 2023年真题 Part1&#xff1a;2019年2023年完整版真题 2019年真题 2…

ubuntu 开启root

sudo passwd root#输入以下命令来给root账户设置密码 sudo passwd -u root#启用root账户 su - root#要登录root账户 root 开启远程访问&#xff1a; 小心不要改到这里了&#xff1a;sudo nano /etc/ssh/ssh_config 而是&#xff1a;/etc/ssh/sshd_config sudo nano /etc/ssh…

猫猫cpu的缓存

原题过长&#xff0c;放一下题目大意 题目大意 给你 m m m 个 1 1 1 到 n n n 之间的整数&#xff0c;你要找到若干个大小为固定的 k k k 的闭区间&#xff0c;使得所有这些数都在你找到的某个区间内。你需要最小化这些区间的并集的大小&#xff0c;并输出此大小。本题里…

基于单片机的两轮直立平衡车的设计

本设计基于单片机设计的两轮自平衡小车&#xff0c;其中机械部分包括车体、车轮、直流电机、锂电池等部件。控制电路板采用STC12C5A60S2作为主控制器&#xff0c;采用6轴姿态传感器MPU6050测量小车倾角&#xff0c;采用TB6612FNG芯片驱动电机。通过模块化编程完成了平衡车系统软…