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

相关文章

  • C++ 数据结构超详细讲解顺序表

    C++ 数据结构:超详细讲解顺序表 什么是顺序表 顺序表是一种线性结构,它用一段地址连续的存储单元依次存储线性表中的各个元素。 顺序表的结构 顺序表由两部分组成,分别是元素存储区和表长度信息。元素存储区通常用数组实现,表长度信息记录表中元素的个数。 顺序表的操作 常见的顺序表操作包括: 初始化操作 插入操作 删除操作 查找操作 遍历操作 初始化顺序表 初始化…

    数据结构 2023年5月17日
    00
  • 一文带你走进js数据类型与数据结构的世界

    一文带你走进JS数据类型与数据结构的世界 一、JS数据类型 1. 原始类型 JS中原始类型包括:Undefined、Null、Boolean、Number、String、Symbol(ES6新增)。 其中Undefined和Null分别代表未定义和空值,Boolean表示布尔值,Number表示数字,String表示字符串,Symbol是ES6新增的一种基础…

    数据结构 2023年5月17日
    00
  • C语言实现通用数据结构之通用椎栈

    C语言实现通用数据结构之通用椎栈 概述 通用椎栈(Generic Linked List Stack),简称GLL Stack,是一种通用的数据结构,能够以动态的方式存储和访问任意类型的数据。GLL Stack 采用链表实现,可以进行进栈(push)、出栈(pop)、查看栈顶元素(peek)、判断栈是否为空(isEmpty)等基本操作。 基本操作 数据结构定…

    数据结构 2023年5月17日
    00
  • Java常见数据结构面试题(带答案)

    Java常见数据结构面试题(带答案)完整攻略 介绍 在Java面试中,数据结构不可避免地成为一部分的考察内容。因此,掌握Java常见数据结构,对于提高面试成功率十分必要。本篇攻略将会介绍常见的Java数据结构,并提供相应的面试题目和答案,希望可以帮助面试者在面试当中更好地展示自己的实力。 目录 结构体 数组 链表 栈 队列 树 哈希表 结构体 在Java中并…

    数据结构 2023年5月17日
    00
  • Java实现链表数据结构的方法

    Java实现链表数据结构的方法可以分为以下步骤: 定义链表节点类Node 首先,在Java中实现链表数据结构,需要定义一个链表节点类,称为Node。Node类中包含两个重要属性: 数据域data,用于存储每个节点的数据信息。 指针域next,用于存储下一个节点的引用。 代码示例: public class Node { public int data; //…

    数据结构 2023年5月17日
    00
  • 「双端队列BFS」电路维修

    本题为3月23日23上半学期集训每日一题中B题的题解 题面 题目描述 Ha’nyu是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女Rika,从而被收留在地球上。Rika的家里有一辆飞行车。有一天飞行车的电路板突然出现了故障,导致无法启动。 电路板的整体结构是一个R行C列的网格( \(R,C \leq 500\) ),如右图所示。每个格点都是…

    算法与数据结构 2023年4月18日
    00
  • Java数据结构之LinkedList的用法详解

    Java数据结构之LinkedList的用法详解 LinkedList简介 LinkedList是Java中的一个数据结构,它是一个双向链表,可以提供快速的插入和删除操作。LinkedList中的元素分别保存在每个节点中,每个节点包含了指向前一个节点和后一个节点的引用。 使用LinkedList的好处是,其可以快速的进行插入和删除操作,但是如果需要随机存取中…

    数据结构 2023年5月17日
    00
  • 栈(Stack)

    概述 栈就是一种 只允许在表尾进行插入和删除操作 的 线性表 栈的特点 先进后出 ,在表尾进行插入和删除操作 数组实现栈 crown crown:使用bottom来确定栈顶所在数组的下标,默认为 -1 空栈 当空栈时 ,crown = -1 栈是否为空 当 crown = -1 时 ,栈为空 ,不能 遍历 ,出栈 , 获取栈顶元素 栈是否已满 当 crown…

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