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日

相关文章

  • 考研数据结构模板:顺序表、链表、栈、队列

    考研数据结构模板:顺序表、链表、栈、队列 前言 代码风格偏向于考研风格而非算法竞赛风格。 代码实现参考《2024数据结构王道复习指导》。 注释详细、保证看懂。 下面是已实现的数据结构模板: 顺序表SeqList 链表LinkList 双链表DLinkList 顺序栈SeqStack 循环顺序队列CircleQueue 链队列LinkQueue 顺序表SeqL…

    算法与数据结构 2023年4月17日
    00
  • Python数据结构之Array用法实例

    Python数据结构之Array用法实例 在Python中,Array是一种很有用的数据结构类型。它可以通过简单的方式存储一系列数据,提供快速的索引访问和高效的操作。本文将详细探讨Python中Array的用法,包括创建Array、插入、删除、修改、查找和遍历等。 创建Array 要创建一个Array,需要使用array模块。在调用前,需要首先导入该模块。A…

    数据结构 2023年5月17日
    00
  • C++超详细讲解单链表的实现

    首先我们来了解一下单链表的概念。 单链表是一种常见的数据结构,在计算机科学中被广泛使用。它是由节点所组成的数据结构,其中每个节点都包含两部分,一个是存储数据的元素,另一个是指向下一个节点的指针。单链表的首节点被称为头部,而最后一个节点则被称为尾部。单链表可以通过在头部插入和删除元素来实现高效地数据操作。接下来我们将讲解如何实现一个 C++ 版的单链表。 实现…

    数据结构 2023年5月17日
    00
  • Lua学习笔记之数据结构

    下面开始对”Lua学习笔记之数据结构”的完整攻略进行详细说明。 一、前言 在学习Lua时,数据结构是非常重要的一个方面,掌握了数据结构,就可以更好地编写Lua程序,提高程序的性能和可读性。本篇攻略主要介绍四种Lua数据结构:数组、表、字符串和函数,分别介绍其含义、特点、创建方法以及基本操作。 二、数组 2.1 数组的定义和创建 Lua中的数组是一种类似于C语…

    数据结构 2023年5月17日
    00
  • MySQL索引结构详细解析

    MySQL索引结构是MySQL数据库中非常重要的一部分,它能够显著提升数据库查询效率。本文将详细解析MySQL索引结构,包括索引的基本概念、常见的索引类型、索引的创建、索引的使用和索引的优化等方面。 索引的基本概念 索引是一种数据结构,它可以加速数据库中的查询操作。索引一般是在表中一个或多个列上创建的,这些列的值被按照一定的规则存储在索引中。当查询时,可以通…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之图的遍历(一)

    我来给您详细讲解一下“C语言数据结构与算法之图的遍历(一)”的完整攻略。 简介 本篇攻略主要介绍了图的遍历问题。图是由若干个点和连接这些点的边构成的数据结构,常用来表示复杂的关系和网络。图的遍历就是从图的某一点开始,按照一定的规则沿着边逐个访问图中所有的点,不重不漏地遍历整个图。 在本篇攻略中,我们将探讨图的深度优先遍历(DFS)和广度优先遍历(BFS)两种…

    数据结构 2023年5月17日
    00
  • 【ACM算法竞赛日常训练】DAY16【奇♂妙拆分】【区区区间间间】【小AA的数列】数学 | 位运算 | 前缀和

    DAY16共3题: 奇♂妙拆分(简单数学) 区区区间间间(单调栈) 小AA的数列(位运算dp) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https://www.eriktse.com…

    算法与数据结构 2023年4月20日
    00
  • C++数据结构之堆详解

    C++数据结构之堆详解 什么是堆 堆是一种完全二叉树。 堆分为大根堆和小根堆,大根堆满足每个节点的值都大于等于它的子节点,小根堆满足每个节点的值都小于等于它的子节点。 堆的实现 常见的实现堆的方式有数组和链表两种。 数组 由于二叉堆是完全二叉树,所以可以用数组来实现: 对于一个节点i,它的左子节点的下标是2 * i + 1,右子节点的下标是2 * i + 2…

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