深入浅析C语言中堆栈和队列

yizhihongxing

深入浅析C语言中堆栈和队列

堆栈(Stack)

堆栈是一种先进后出(Last In First Out,LIFO)的线性数据结构,只允许在一端进行插入和删除操作。堆栈在C语言中常用于函数调用时的参数传递、表达式求值和程序中断处理等场景。

实现堆栈的基本操作

下面是堆栈的基本操作,可以用数组来实现:

初始化

#define MAX_SIZE 100  // 假设堆栈最大容量是100
int stack[MAX_SIZE];  // 堆栈数组
int top = -1;  // 栈顶指针,初始值为-1

void init() {
    top = -1;
}

压栈

void push(int value) {
    if (top == MAX_SIZE - 1) {
        printf("stack overflow!\n");
        return;
    }
    stack[++top] = value;
}

弹栈

int pop() {
    if (top == -1) {
        printf("stack underflow!\n");
        return -1;
    }
    return stack[top--];
}

取栈顶元素

int peek() {
    if (top == -1) {
        printf("stack is empty!\n");
        return -1;
    }
    return stack[top];
}

堆栈的示例说明

下面是一条实例说明堆栈的应用:

假设今天你要去超市买东西,商店里要求使用购物车。但是你发现购物车不够了,只剩下一个,于是你就将自己的小车丢在了车车的上方,继续进行购物。

你这个行为实际是使用了一个堆栈。

你新拿到的物品排在栈顶,你所有的购物结果能够获取的物品,就是从栈顶开始弹出所有的物品。

队列(Queue)

队列是一种先进先出(First In First Out,FIFO)的线性数据结构,队列有两个指针:队头指针和队尾指针,分别用于插入和删除操作。队列在C语言中常用于模拟进程调度、缓存队列和消息传递等场景。

实现队列的基本操作

下面是队列的基本操作,可以用数组来实现:

初始化

#define MAX_SIZE 100  // 假设队列最大容量是100
int queue[MAX_SIZE];   // 队列数组
int front = 0;  // 队头指针,初始值为0
int rear = -1;  // 队尾指针,初始值为-1

void init() {
    front = 0;
    rear = -1;
}

元素入队

void push(int value) {
    if (rear == MAX_SIZE - 1) {
        printf("queue overflow!\n");
        return;
    }
    queue[++rear] = value;
}

元素出队

int pop() {
    if (front > rear) {
        printf("queue underflow!\n");
        return -1;
    }
    return queue[front++];
}

队头元素

int peek() {
    if (front > rear) {
        printf("queue is empty!\n");
        return -1;
    }
    return queue[front];
}

队列的示例说明

下面是一条实例说明队列的应用:

假设有一只猫,它想在门外等主人回来。当它到达门口时,就在看门的地方坐下来。然后它看到一只老鼠从草丛中跑了出来,于是就追它。但是它并没有追上老鼠,所以它走回原来的位置等待主人回来。猫不停地重复这个过程,直到主人回来。

这个过程可以用队列来模拟。在队列里,猫的相对位置被维护。当猫追老鼠时,位置会前进,当猫回到原来的位置时,位置又会后退。这里主人即构成队列的对象,背上放有猫。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入浅析C语言中堆栈和队列 - Python技术站

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

相关文章

  • 字符串算法–$\mathcal{KMP,Trie}$树

    \(\mathcal{KMP算法}\) 实际上,完全没必要从\(S\)的每一个字符开始,暴力穷举每一种情况,\(Knuth、Morris\)和\(Pratt\)对该算法进行了改进,称为 \(KMP\) 算法。 而\(KMP\)的精髓在于,对于每次失配之后,我都不会从头重新开始枚举,而是根据我已经得知的数据,从某个特定的位置开始匹配;而对于模式串的每一位,都有…

    算法与数据结构 2023年4月18日
    00
  • 【ACM算法竞赛日常训练】DAY4题解与分析【树】【子序列】| 组合数学 | 动态规划

    DAY4共2题: 树(组合数学) 子序列(dp,数学) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eriktse.com/algorithm/109…

    算法与数据结构 2023年4月18日
    00
  • C语言数据结构 链表与归并排序实例详解

    C语言数据结构 链表与归并排序实例详解 链表介绍 链表是一种数据结构,它对于存储数据是动态而灵活的。它可以根据我们的需要动态的分配内存空间。链表是由先后相连的数据单元(结点)组成,每个结点都包含了下一结点的地址信息,最后一个结点的地址信息为NULL。链表按照操作方式可以分为单向链表、双向链表与循环链表等几种类型。 归并排序原理 归并排序是一种分治思想的算法,…

    数据结构 2023年5月16日
    00
  • Huffman实现

    Huffman编码树 秒懂:【算法】Huffman编码_哔哩哔哩_bilibili 约定:字符x的编码长度 就是其对应叶节点的深度; 在一个字符集中,每个字符出现的次数有多有少,那么若都采用固定长度编码的话,那么编码长度会非常大,并且搜索时间复杂度都非常高;若采用非固定编码,出现次数多的字符编码长度小一些,并且放在树深度小的地方,提高搜索时间效率;这样带权平…

    算法与数据结构 2023年4月17日
    00
  • C语言数据结构树的双亲表示法实例详解

    C语言数据结构树的双亲表示法实例详解 什么是双亲表示法 在树上,每个节点都有且仅有一个父节点(根节点除外)。对于一个树结构,我们可以使用许多方法来表示这个树,其中最常见的一种方法是双亲表示法。该表示法使用一个一维数组来存储树的节点,数组的下标即为该节点的编号,数组的值则表示该节点的父节点编号。 当一个节点没有父节点时,该节点即为根节点。 双亲表示法的优缺点 …

    数据结构 2023年5月17日
    00
  • Java 数据结构与算法系列精讲之环形链表

    Java 数据结构与算法系列精讲之环形链表 概述 在本文中,我们将探讨环形链表的相关概念,以及如何使用Java语言实现环形链表的各种操作。我们将依次介绍以下几个部分: 环形链表的基本概念 环形链表的创建 环形链表的遍历 环形链表的插入、删除、查找等操作 环形链表的示例程序 环形链表的基本概念 链表是一种基本的数据结构,是由一组节点组成的序列,每个节点包含数据…

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

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

    数据结构 2023年5月17日
    00
  • 京东LBS推荐算法实践

    作者:京东零售 郑书剑 1、推荐LBS业务介绍 1.1 业务场景 现有的同城购业务围绕京东即时零售能力搭建了到店、到家两种业务场景。同城业务与现有业务进行互补,利用高频,时效性快的特点,可以有效提升主站复访复购频次,是零售的重要战略方向。 1.2 名词解释 LBS:基于位置的服务(Location Based Services)。 下文LBS商品代指京东小时…

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