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

yizhihongxing

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日

相关文章

  • 【ACM算法竞赛日常训练】DAY10题解与分析【月月给华华出题】【华华给月月出题】| 筛法 | 欧拉函数 | 数论

    DAY10共2题: 月月给华华出题 华华给月月出题 难度较大。 ? 作者:Eriktse? 简介:211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eriktse.com/algorithm/110…

    算法与数据结构 2023年4月17日
    00
  • 【华为OD机试 2023】专栏介绍 +华为OD机试介绍+ 真题目录【转载】

    华为题库说明 2022与2023题库的区别 华为OD机试的题库是季度更新的(Q1\Q2\Q3\Q4)。笔者专栏的题库分为2023和2022。 2023的题库是包括2022.11(Q4第四季度)之后以及2023年的题库。 2022的题库是包括2022.11(Q4第四季度)之前题库。 支持的语言 目前大部分题 使用C++ Java JavaScript 以及py…

    算法与数据结构 2023年4月17日
    00
  • MySQL索引原理详解

    MySQL索引原理详解 MySQL索引是一种数据结构,用于帮助查询语句更快地访问到所需的数据,提高数据库查询效率。本文将详细讲解MySQL索引的原理、类型及如何创建索引。 索引原理 B树 MySQL索引底层数据结构主要采用B树,B树是一种多路平衡查找树。B树的每一个节点可以存储多个键值,每个节点的子节点个数也可以大于2,从而使得查询效率更高。 索引分类 My…

    数据结构 2023年5月17日
    00
  • 牛客小白月赛71

    A.猫猫与广告 题目: 分析: 只需考虑c * d的矩阵竖着摆和横着摆两种情况。本题提示了考虑两矩阵对应边平行的情况,实际上可以证明倘若能斜着放,那么一定可以横着放或竖着放,证明方式可已通过构造三角形来证明a* b的矩阵的长宽一定小于c * d矩阵的长宽。 code: #include <iostream> #include <cmath&…

    算法与数据结构 2023年4月25日
    00
  • C语言数据结构哈希表详解

    C语言数据结构哈希表详解 什么是哈希表? 哈希表(Hash Table)是一种采用散列函数(hash函数)将数据映射到一个固定长度的数组中,并且以 O(1) 的时间复杂度进行数据插入、查找、删除操作的数据结构。哈希表主要由以下三个组成部分构成:- 数组:用于存储映射到对应下标上的数据。- 散列函数:将数据映射到数组下标上的规则。- 冲突处理方式:当不同的数据…

    数据结构 2023年5月16日
    00
  • C语言线性表顺序表示及实现

    C语言线性表顺序表示及实现 线性表的概念 线性表是一种数据结构,它是由n(n≥0)个数据元素a1,a2,…,an 组成的有限序列(元素个数为0时,称为空表),并且这些数据元素遵循一定的线性关系。 线性表的存储结构 线性表的存储结构有两种:顺序存储和链式存储。顺序存储指的是用一段连续的存储单元依次存储线性表的数据元素,线性表中的元素在物理位置上也是相邻的;…

    数据结构 2023年5月17日
    00
  • ES6新特性五:Set与Map的数据结构实例分析

    ES6新特性五:Set与Map的数据结构实例分析 ES6引入了Set和Map两种新的数据结构,可以帮助我们更方便地操作一些复杂的数据结构。本文将会分别介绍Set和Map的基本用法,并且提供一些实例说明,帮助大家更好地理解。 Set数据结构 基本用法 Set对象是一种无序的、无重复元素、容器类的数据结构。其基本用法如下: const set = new Set…

    数据结构 2023年5月17日
    00
  • Go 数据结构之二叉树详情

    Go 数据结构之二叉树详情 二叉树是一种树形数据结构,它的每个节点至多只有两个子节点,通常称为左子节点和右子节点。在本文中,我们将介绍二叉树的定义、遍历方法和常见应用场景。 定义 一个二叉树是一个有根树,它的每个节点最多有两个子节点,用左子树和右子树来区分。 在 Go 代码中,可以通过如下结构体定义表示二叉树的节点: type Node struct { L…

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