C语言编程数据结构的栈和队列

C语言编程数据结构的栈和队列

什么是栈

栈(Stack) 是限定仅在表尾进行插入和删除操作的线性表。栈也称为后进先出( Last In First Out)的线性表,简称 LIFO 结构。栈结构有两个最重要的操作:入栈和出栈。其中,入栈操作向栈中添加一个元素,出栈操作从栈中删除一个元素。

栈的基本操作

  1. 初始化栈
  2. 入栈
  3. 出栈
  4. 取栈顶元素
  5. 判空
  6. 判满
// 栈的结构体
typedef struct Stack {
    int top;
    int maxSize;
    int *data;
} Stack;

// 初始化栈
void initStack(Stack *stack, int size){
    stack->top = -1;
    stack->maxSize = size;
    stack->data = (int *)malloc(sizeof(int)*size);
}

// 入栈
void push(Stack *stack, int value){
    if(stack->top == stack->maxSize-1){
        printf("栈已满,无法入栈!");
        return;
    }
    stack->top++;
    stack->data[stack->top] = value;
}

// 出栈
int pop(Stack *stack){
    if(stack->top == -1){
        printf("栈已空,无法出栈!");
        return 0;
    }
    int value = stack->data[stack->top];
    stack->top--;
    return value;
}

// 取栈顶元素
int top(Stack *stack){
    if(stack->top == -1){
        printf("栈为空!");
        return 0;
    }
    return stack->data[stack->top];
}

// 判空
int isEmpty(Stack *stack){
    return stack->top==-1;
}

// 判满
int isFull(Stack *stack){
    return stack->top==stack->maxSize-1;
}

栈的应用

  • 函数调用
  • 表达式求值
  • 四则运算转中缀表达式

什么是队列

队列(Queue)是限定仅在表的一端进行插入,而在另一端进行删除的线性表。队列也称为先进先出( First In First Out)的线性表,简称 FIFO 结构。队列结构有两个最重要的操作:入队和出队。其中,入队操作向队列中添加一个元素,出队操作从队列中删除一个元素。

队列的基本操作

  1. 初始化队列
  2. 入队
  3. 出队
  4. 取队头元素
  5. 判空
  6. 判满
// 队列的结构体
typedef struct Queue {
    int front;  // 队头指针
    int rear;   // 队尾指针
    int maxSize;
    int *data;
} Queue;

// 初始化队列
void initQueue(Queue *queue, int size){
    queue->front = 0;
    queue->rear = -1;
    queue->maxSize = size;
    queue->data = (int *)malloc(sizeof(int)*size);
}

// 入队
void enqueue(Queue *queue, int value){
    if(queue->rear == queue->maxSize-1){
        printf("队列已满,无法入队!");
        return;
    }
    queue->rear++;
    queue->data[queue->rear] = value;
}

// 出队
int dequeue(Queue *queue){
    if(queue->front > queue->rear){
        printf("队列已空,无法出队!");
        return 0;
    }
    int value = queue->data[queue->front];
    queue->front++;
    return value;
}

// 取队头元素
int front(Queue *queue){
    if(queue->front > queue->rear){
        printf("队列为空!");
        return 0;
    }
    return queue->data[queue->front];
}

// 判空
int isEmpty(Queue *queue){
    return queue->front > queue->rear;
}

// 判满
int isFull(Queue *queue){
    return queue->rear==queue->maxSize-1;
}

队列的应用

  • 广度优先搜索(BFS)
  • 打印任务队列

示例

栈的示例

#include<stdio.h>
#include<stdlib.h>
#include"stack.h"

// 判断一个括号匹配表达式的正确性
int isBracketMatch(char *str){
    Stack stack;
    initStack(&stack, 50);
    int i = 0;
    while(str[i] != '\0'){
        if(str[i] == '('){
            push(&stack, '(');
        }else if(str[i] == ')'){
            if(isEmpty(&stack)){
                return 0;
            }else{
                pop(&stack);
            }
        }
        i++;
    }
    free(stack.data);
    return isEmpty(&stack);
}

// 测试函数
int main(){
    char *str = "()()((())))";
    int result = isBracketMatch(str);
    if(result){
        printf("括号匹配正确!");
    }else{
        printf("括号匹配不正确!");
    }
    return 0;
}

队列的示例

#include<stdio.h>
#include<stdlib.h>
#include"queue.h"

// 打印任务结构体
typedef struct Task {
    int id, priority;
} Task;

// 初始化任务队列
void initTaskQueue(Queue *queue){
    initQueue(queue, 50);
}

// 添加任务
void addTask(Queue *queue, Task task){
    enqueue(queue, task.id);
}

// 处理任务队列
void processTaskQueue(Queue *queue){
    while(!isEmpty(queue)){
        int taskId = dequeue(queue);
        printf("正在处理任务%d\n", taskId);
    }
}

// 测试函数
int main(){
    Queue queue;
    initTaskQueue(&queue);
    Task task1 = {1, 1};
    addTask(&queue, task1);
    Task task2 = {2, 2};
    addTask(&queue, task2);
    Task task3 = {3, 1};
    addTask(&queue, task3);
    Task task4 = {4, 3};
    addTask(&queue, task4);
    processTaskQueue(&queue);
    return 0;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言编程数据结构的栈和队列 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Java数据结构之KMP算法的实现

    Java数据结构之KMP算法的实现 1. KMP算法的概述 KMP算法的全称是Knuth-Morris-Pratt算法,是一种字符串匹配算法,用于在文本串S内查找一个模式串P的出现位置。它的特点是在P和S两个序列中,当匹配失败时,它会跳过P的部分已匹配的字符,利用这个信息来减少S和P之间的匹配次数,从而提高匹配效率。 2. KMP算法的实现 2.1 预处理失…

    数据结构 2023年5月17日
    00
  • 关于图片存储格式的整理(BMP格式介绍)

    关于图片存储格式的整理(BMP格式介绍) 一、BMP格式概述 BMP全称为Bitmap,是一种基础的图像保存格式,它的格式十分简单,就是将每个像素点的颜色信息直接保存在文件中,因此它的信息量相对较大。 BMP格式的文件头有标准结构,其中包含位图的宽、高、颜色数、位图大小等信息,其中颜色数的位数(色深)决定了BMP文件的大小。BMP文件还可以包含调色板,来进行…

    数据结构 2023年5月17日
    00
  • 滑动窗口总结

    前言 滑动窗口是双指针的一种特例,可以称为左右指针,在任意时刻,只有一个指针运动,而另一个保持静止。滑动窗口路一般用于解决特定的序列中符合条件的连续的子序列的问题。 好处:时间复杂度 O(n^2) —> O(n) 一、算法应用场景 关键词: 1.满足XXX条件(计算结果、出现次数、同时包含) 2.最长/最短/或最值 3.子串/子数组/子序列 最最最…

    算法与数据结构 2023年4月17日
    00
  • C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历)

    下面是关于C++二叉树数据结构的详细攻略。 什么是二叉树 二叉树是一种树形数据结构,每个节点最多有两个子节点:左节点和右节点。一个节点没有左节点或右节点则分别为左子树和右子树为空。 递归遍历二叉树 前序遍历 前序遍历是指对于一棵二叉树,在访问右子树之前,先访问根节点,然后访问左子树。 下面是C++递归遍历二叉树的前序遍历示例代码: template <…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构链表知识详解

    JavaScript数据结构链表知识详解 什么是链表 链表是一种线性结构,相比于数组,它不需要一块连续的内存空间,而是通过指针将一组零散的内存块串联起来使用。链表只保持一个指向链表中第一个节点的引用,每个节点则有指向下一个节点的指针。 链表的实现 链表的实现方式有很多种,下面介绍一种简单的单向链表实现方式,其中每个节点包含一个value属性和一个next属性…

    数据结构 2023年5月17日
    00
  • c语言实现单链表算法示例分享

    下面是详细的攻略。 C语言实现单链表算法示例分享 什么是单链表 单链表是一种数据结构,它由一个个节点组成,每个节点包含两个部分:一个是数据部分,另一个是指针部分,指针部分指向下一个节点的位置。单链表的节点是动态分配的,可以随时插入、删除,是一种非常灵活的数据结构。 为什么要使用单链表 在进行一些操作时,数组或者普通的指针会遇到很多麻烦。比如在删除数组元素时,…

    数据结构 2023年5月17日
    00
  • Python 树表查找(二叉排序树、平衡二叉树)

    下面是 Python 树表查找(二叉排序树、平衡二叉树)的完整攻略: 什么是树表查找 树表查找是一种数据结构,用于在数据集合中快速查找、插入和删除数据。树表查找的基本思想是利用特定的树形结构,在不断比较和移动中找到目标数据。常见的树表查找有二叉排序树和平衡二叉树。 二叉排序树(Binary Search Tree) 二叉排序树是一种特殊的二叉树结构,它满足以…

    数据结构 2023年5月17日
    00
  • MySQL高级篇之索引的数据结构详解

    MySQL高级篇之索引的数据结构详解 索引的作用 索引是一种数据结构,用于快速地定位和访问数据表中的指定行。MySQL中索引通常以B-tree(B树)或哈希表的形式来实现,通过将索引存储在内存中,可以提高系统的查询效率。 常用的索引分为主键索引、唯一索引和普通索引。其作用分别为: 主键索引:保证表中每一行数据的唯一性,便于快速查询和修改数据。 唯一索引:保证…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部