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

深入浅析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日

相关文章

  • Java数据结构之线索化二叉树的实现

    Java数据结构之线索化二叉树的实现 线索化二叉树的概述 线索化二叉树(Threaded Binary Tree)是一种优化的二叉树结构。它的优点是可以在O(n)的时间复杂度内,进行中序遍历。而在普通二叉树中进行中序遍历需要的时间复杂度是O(nlogn)。线索化二叉树的原理是利用空闲的指针域,来记录中序遍历中前驱与后继结点的位置。线索化二叉树中会出现两种类型…

    数据结构 2023年5月17日
    00
  • MySQL数据库体系架构详情

    MySQL数据库体系架构是MySQL数据库自身的发展和演变过程中逐渐形成的一个庞大的体系。这个体系由多个组件构成,包括连接器、查询缓存、解析器、优化器、执行器、存储引擎等多个部分,其中存储引擎是其中最具有代表性的组件之一。在这篇攻略中,我们将详细讲解MySQL数据库体系架构的各个部分,介绍它们各自的功能和作用。 连接器 MySQL的连接器负责与客户端建立连接…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构与算法

    JavaScript数据结构与算法完整攻略 什么是数据结构与算法 数据结构和算法是计算机科学的重要组成部分,常用于解决数据处理问题的方法与技术。数据结构是指存储和组织数据的方式,而算法则是解决数据处理问题的途径和方法。 数据结构分类 数据结构可分为以下几类: 数组 —— 存储有序元素集合的线性结构; 栈 —— 一种后进先出的数据结构; 队列 —— 一种先进先…

    数据结构 2023年5月17日
    00
  • Go 数据结构之堆排序示例详解

    Go 数据结构之堆排序示例详解 什么是堆? 堆(Heap)是一种特殊的树形数据结构,它满足下列性质: 堆中每个节点的关键字都不大于(或不小于)其子节点的关键字。 堆中,根节点(顶端)是最小或最大元素。 堆实际上是一个完全二叉树,因此可以用数组实现。对于下标为i的节点,其左子节点为2i,右子节点为2i+1,父节点为i/2。 堆分为最大堆和最小堆。在最大堆中,父…

    数据结构 2023年5月17日
    00
  • 带头节点的单链表的思路及代码实现

    带头节点的单链表的思路及代码实现(JAVA) 一、什么是的单链表 ①标准定义 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) +指针(指示后继元素存储位置,元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。) 以上是标准定义不太好让人对单链表有直观…

    算法与数据结构 2023年4月17日
    00
  • C语言超详细讲解数据结构中的线性表

    C语言超详细讲解数据结构中的线性表完整攻略 线性表的概念和基本操作 线性表是指由同类型的数据元素构成的有限序列。即每个数据元素只有一个前驱和一个后继。线性表通常用于表示一维数组、列表、队列等数据结构。 线性表的基本操作包括: 初始化操作:创建一个空的线性表。 插入操作:在线性表中插入一个元素。 删除操作:删除线性表中的一个元素。 查找操作:查找线性表中是否存…

    数据结构 2023年5月17日
    00
  • 基于C++详解数据结构(附带例题)

    基于C++详解数据结构(附带例题)攻略 简介 该攻略是基于C++编程语言详解数据结构的,主要涉及数据结构中的相关概念、操作以及例题演练。C++语言作为一种高性能的编程语言,对于开发数据结构问题具有很大的优势。 数据结构概念 数据结构基本概念 数据结构是计算机存储、组织数据的方式。具体来说,数据结构可以理解为计算机存储数据的一种方式,也可以看作是一些组织数据的…

    数据结构 2023年5月17日
    00
  • C语言 数据结构之数组模拟实现顺序表流程详解

    C语言 数据结构之数组模拟实现顺序表流程详解 什么是顺序表? 顺序表是一种基于连续存储结构的数据结构,它可以用一段连续的存储单元来存储线性表中的所有元素。 顺序表的实现思路 顺序表的实现主要依赖数组。我们可以定义一个数组来存储线性表的数据元素,同时再定义一个变量来保存线性表当前的长度。当需要对线性表进行插入、删除、查找等操作时,根据需求,可以通过数组的下标来…

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