408王道数据结构强化——应用题(一)

简介: 408王道数据结构强化——应用题

1.栈、数组和队列的应用

1.1.栈

1.1.1.栈的定义:

#define MAXSIZE
typedef struct Stack{
    int data[MAXSIZE];
    int top;
}Stack;

1.1.2.栈的基本操作的代码实现:

1.建立栈:

void InitStack(Stack &s){
    s.top = -1;
}

2.入栈(push):

bool Push(Stack &s, int e){
    if (s.top == MAXSIZE - 1) return false;    //判断是否栈已满
    s.data[++s.top] = e;    //将栈顶指针先+1,然后将e存入栈顶
    return true;
}

3.出栈(pop):

bool Pop(Stack &s, int &e){
    if (s.top == -1) return false;    //判断是否栈空
    s.data[s.top--] = e;    //先将栈顶元素赋值给e,然后栈顶指针-1
    return true;
}

4.判断栈空:

bool IsEmpty(Stack s){
    if (s.top == -1) return true;    //判断栈顶指针是否为-1
    else return false;
}

5.查看栈顶元素:

bool GetTop(Stack S, int &e){
    if (s.top == -1) return false;    //判断是否栈空
    e =  s.data[s.top];
    return true;
}

1.1.3.栈的数据结构的手绘

03b73998922b4d44936febd801c315f6.png

1.1.4.栈的基本操作的手绘5f572961b15147f889032aac722b1ae8.png

1.2.队列

1.2.1.队列的定义

1.顺序栈:

#define MAXSIZE 100
typedef struct SqQueue{
    int data[MAXSIZE];
    int front, rear;
}SqQueue;

2.链栈:

typedef struct LNode{    //链式队列结点的定义
    struct LNode *next;
    int data;
}*LinkList, LNode;
typedef struct LinkQueue{    //链式队列的定义
    LNode *front, *rear;    //头尾指针
}LinkQueue;

1.2.2.顺序队列的基本操作(循环队列)

1.建立队列:

void InitQueue(SqQueue &Q){
    Q.rear = 0;    //将front和rear都置为0,
    Q.front = 0;
}

2.入队:rear对队列的最大容量取余,且不能使用Q.rear++

bool EnQueue(SqQueue &Q, int e){
    if ((Q.rear + 1)) % MAXSIZE = Q.front) return false;    //判断是否队满
    Q.data[Q.rear] = e;
    Q.rear = (Q.rear + 1) % MAXSIZE;
    return true;
}

3.出队:front对队列的最大容量取余,且不能使用Q.front++

bool DeQueue(SqQueue &Q, int &e){
    if (Q.front == Q.rear) return false;    //队空
    e = Q.data[Q.front++];
    return true;
}

4.判断对空:

bool IsEmpty(SqQueue Q){
    if (Q.front == Q.rear) return true;    //队空时rear和front指向同一个地方
    else return false;
}

5.得到队首元素:

bool GetFront(SqQueue Q, int &e){
    if (Q.front == Q.rerar) return false;    //队空
    e = Q.data[Q.front];
    return true;
}

1.2.3.链式队列的基本操作

1.队列初始化:在申明一个链式队列后,只有头尾结点指针,需要申明一个头结点

void InitQueue(LinkQueue &Q){
    Q.front = Q.rear = (LNode*)malloc(sizeof(LNode));    //申明一个头结点
    Q.front->next = NULL;    //将next指针置空
}

2.入队:

void EnQueue(LinkQueue &Q, int e){
    LNode *p = (LNode*)malloc(sizeof(LNode));    //申明一个新结点p
    p->data = e;    //e赋值给p的数据域
    p->next = NULL;    //p的next指针置空
    Q.rear->next = p;    //将p插入到队尾
    Q.rear = p;    //将rear指向p
}  

3.出队:需要判断是否队中只有一个元素

bool DeQueue(LinkQueue &Q, int &e){
    if (Q.rear == Q.front) return false;    //队空
    LNode *p = Q.front->next;    //申明LNode类型的指针p指向队首元素
    e = p->data;    //将p的数据域赋值给e
    if (Q.rear = p) {    //队中只有元素p
        Q.rear = Q.front;
        Q.front->next;
    }
    else Q.front->next = p->next;    //对中不止有元素p,则front的next指针指向p的下一个元素
    free(p);    
    return true;
}

4.判断对空:队首指针和队尾指针指向同一个地方时对空

bool IsEmpty(LinkQueue Q){
    if (Q.front == Q.rear) return true;
    else return false;
}

1.2.4.队列的数据结构的手绘a430ef0b55ed4a4186308fdef0491fde.pngc65f0404726d4728b2df994fd36e0641.png

1.2.5.队列的基本操作的手绘

1.循环队列:0c7024aa90a54bf09ebf14bc393532f1.png

2.链式队列:

①front指针始终指向头结点,rear在队中有元素时始终指向队尾元素

②初始状态和队空时:front和rear都只指向头结点

1.3.数组

申明n个元素的数组:

int *arr = (int*)malloc(sizeof(int) * n);
memset(arr, 0, sizeof(int) * n);

55ba04a45ec04c6ab1de2f3bd31e6c57.png

2.树

2.1.树的数据结构定义和手绘

2.1.1.二叉树

1.顺序结构:通常用于存放完全二叉树

#define MAXSIZE 100
typedef struct TreeNode{
    int value;    //当前结点的值
    bool IsEmpty;    //表示当前的结点是否为空
}TreeNode;

4ae42b4bd0e742d7a3d7532b18f0fb1e.png

2.单向链:

typedef struct BiTNode{
    int value;    //当前结点的值
    struct BiTNode *lchild, *rchild;    //指向当前结点左右子树的指针
}BiTNode, *BiTree;

5dbd01bcde484893a9e00ffceca0b17e.png

3.双向链:双亲节点指向孩子结点,孩子结点也指向双亲结点

typedef struct BiTNode{
    struct BiTNode *lchild, *rchild, *parent;    //parent指针指向该结点的双亲结点
    int value;
}BiTNode, *BiTree;

2.1.2.多叉树

408数据结构学习笔记——树、森林_江南江南江南丶的博客-CSDN博客

1.双亲表示法(并查集)

#define MAXSIZE 100
typedef struct PNode{
    int value;    //该结点的值
    int parent;    //伪指针,用于指向双亲结点(双亲结点的数组下标)
}PNode;
typedef struct PTree{
    PNode node[MAXSIZE];    //申明一片PNode类型个数为MAXSIZE的数组用于存储树
    int n;    //表示该树中的结点个数
}PTree;

2.孩子表示法:

typedef struct CTNode{    //链式存储,存放该结点的每个孩子结点的信息(非孩子结点的数据)
    int child;    //该结点的孩子结点在数组中的下标
    struct CTNode *next;    //指向该孩子结点的下个孩子结点
}CTNode;
typedef struct CTBox{    //定义具体结点,存放结点数据,并且存放该元素的第一个孩子结点
    int data;
    CTNode *firstChild;
}CTBox;
typedef struct CTree{    //顺序存储结点
    CTBox nodes[MAXSIZE];    //定义一个CTBox类型长度为MAXSIZE的数组
    int n, r;    //n为结点的总个数,r为根节点的数组下标
}CTree;

d656c941fa964a84a2f40089440697c1.png

3.孩子兄弟表示法:

typedef struct CSNode {
    int value;    //结点数据
    struct CSNode *firstChild, *nextChild;
}CSNode, *CSTree;

3d67e8226a644ee3bbc218915f55e2df.png

2.2.二叉树的基本操作

408数据结构学习笔记——二叉树的遍历和线索二叉树_江南江南江南丶的博客-CSDN博客

1.先序遍历:

void PreOrder(BiTree T){
    if (T) {
        visit(T);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}

2.中序遍历:

void InOrder(BiTree T) {
    if (T) {
        InOrder(T->lchild);
        visit(T);
        InOrder(T->rchild);
    }
}

3.后序遍历:

void PostOrder(BiTree T) {
    if (T){
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        visit(T);
    }
}

4.层次遍历:

typedef struct BiTNode{
    int value;
    struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
typdef struct LinkNode{
    BiTNode *data;
    struct LinkNode *next;
}LinkNode;
typdef struct LinkQueue{
    LinkNode *front, *rear;
}LinkQueue;
void LevelOrder(BiTree T) {
    LinkQueue Q;
    InitQueue(Q);    //初始化队列
    BiTNode *p;
    EnQueue(Q, T);    //根结点入队
    while(!IsEmpty(Q)) {
        DeQueue(Q, p);    //出队队首元素
        visit(p);    //访问p
        if (p->lchild) EnQueue(Q, p->lchild);    //左子树入队
        if (p->rchild) EnQueue(Q, p->rchild);    //右子树入队
    }
}


相关文章
|
28天前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
42 1
|
22天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
22天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
22天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
22天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
22天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
27天前
|
机器学习/深度学习 存储 人工智能
数据结构在实际开发中的广泛应用
【10月更文挑战第20天】数据结构是软件开发的基础,它们贯穿于各种应用场景中,为解决实际问题提供了有力的支持。不同的数据结构具有不同的特点和优势,开发者需要根据具体需求选择合适的数据结构,以实现高效、可靠的程序设计。
61 7
|
22天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
22天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
22天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构的基本概念;算法的基本概念、特性以及时间复杂度、空间复杂度等举例说明;【含常见的报错问题及其对应的解决方法】

热门文章

最新文章