栈与队列(C语言版)

文章目录

  • 栈与队列
    • 1. 栈
      • 基本操作
      • 实现(基于链表)
        • 代码
        • 运行结果
      • 应用场景
    • 2. 队列
      • 基本操作
      • 实现
        • 代码
        • 运行结果
      • 应用场景

栈与队列

1. 栈

栈是一种操作受限的线性结构。操作受限体现在,栈只能在一端添加和删除元素,符合后进先出 ( LIFO ) 的特性,如下图所示:

在这里插入图片描述

基本操作

  1. 入栈
  2. 出栈
  3. 查看栈顶元素
  4. 判空

实现(基于链表)

代码
// Stack.h
// 定义结点类型
typedef struct node {int val;struct node* next;} Node;// API
void push_stack(Node** pstack, int val);
int  pop_stack(Node** pstack);
int  peek_stack(Node* stack);
bool is_empty(Node* stack);
// Stack.c
#include "stack.h"
#include <stdlib.h>
#include <stdio.h>void push_stack(Node** pstack, int val) {// 头插法Node* newNode = (Node*)malloc(sizeof(Node));newNode->val = val;newNode->next = NULL;newNode->next = *pstack;*pstack = newNode;
}int pop_stack(Node** pstack) {if (*pstack == NULL) {printf("栈为空,无法弹出元素");return -1;}int pop_val = (*pstack)->val;*pstack = (*pstack)->next;printf("弹出元素:%d\n", pop_val);return pop_val;
}int  peek_stack(Node* stack) {if (stack == NULL) {printf("栈为空, 无法查看栈顶元素\n");return -1;}printf("栈顶元素:%d\n", stack->val);return stack->val;
}bool is_empty(Node* stack) {if (stack) {printf("栈不为空\n");return false;}printf("栈为空\n");return true;
}
// main.c
#include<stdio.h>
#include"stack.h"int main(void) {Node* stack = NULL;push_stack(&stack, 1);push_stack(&stack, 2);peek_stack(stack);pop_stack(&stack);peek_stack(stack);is_empty(stack);pop_stack(&stack);peek_stack(stack);is_empty(stack);return 0;}
运行结果

在这里插入图片描述

应用场景

栈的应用场景是多种多样的:

  • 函数调用栈
  • 符号匹配问题
  • 表达式求值
  • 深度优先搜索(DFS)
  • . . .

2. 队列

队列是另一种操作受限的线性结构。操作受限体现在,队列只能在一端添加元素,在另一端删除元素,符合**先进先出(FIFO)**的特性。

在这里插入图片描述

基本操作

  1. 入队列
  2. 出队列
  3. 查看队头元素
  4. 判空

实现

代码
  1. 用链表实现

  2. 用数组实现(没使用循环数组的方法, 没有自动扩容功能

    // Queue.h
    #define N 10typedef struct {int elements[N];int front;int rear;int size;
    } Queue;// API
    Queue* create_queue();
    void destroy_queue(Queue* q);void push_queue(Queue* q, int val);
    int pop_queue(Queue* q);
    int peek_queue(Queue* q);bool is_empty(Queue* q);
    bool is_full(Queue* q);
    
    // Queue.c
    #include "queue.h"
    #include <stdio.h>
    #include <malloc.h>Queue* create_queue() {Queue* que = (Queue*)malloc(sizeof(Queue));que->front = 0; // 队头que->rear = -1; // 队尾que->size = 0;return que;
    }void destroy_queue(Queue* q) {free(q);printf("队列已释放\n");
    }void push_queue(Queue* q, int val) {if (is_full(q)) {printf("队列已满,无法插入元素\n");return;}if (q->rear == N - 1) { // 队尾指针已经到数组尾部边界,需要将元素移动到数组头部for (int i = q->front, j = 0; i <= q->rear; i++, j++) {q->elements[j] = q->elements[i];}q->front = 0;q->rear = q->size - 1;}q->elements[q->rear + 1] = val;q->rear++;q->size++;printf("成功在队尾插入元素:%d\n", val);
    }int pop_queue(Queue* q) {if (is_empty(q)) {printf("队列为空,无法弹出元素\n");return -1;}int pop_val = q->elements[q->front];q->front++;q->size--;printf("成功在队头弹出元素:%d\n", pop_val);return pop_val;
    }int peek_queue(Queue* q) {if (is_empty(q)) {printf("队列为空,无法查看元素\n");return -1;}return q->elements[q->front];
    }bool is_full(Queue* q) {if (q->rear - q->front == N - 1) {// printf("队列已满\n");return true;}return false;
    }bool is_empty(Queue* q) {if (q->rear < q->front) {// printf("队列为空\n");return true;}return false;
    }
    
    // main.c
    #include <stdio.h>
    #include "queue.h"int main(void) {Queue* que = create_queue();pop_queue(que);push_queue(que, 1);push_queue(que, 2);push_queue(que, 3);printf("查看队头元素:%d\n", peek_queue(que));pop_queue(que);printf("查看队头元素:%d\n", peek_queue(que));push_queue(que, 4);push_queue(que, 5);push_queue(que, 6);push_queue(que, 7);push_queue(que, 8);push_queue(que, 9);push_queue(que, 10);printf("队头索引:%d  队尾索引:%d\n", que->front, que->rear);printf ("队列元素个数:%d\n", que->size);push_queue(que, 11);printf("队头索引:%d  队尾索引:%d\n", que->front, que->rear);printf ("队列元素个数:%d\n", que->size);push_queue(que, 12);destroy_queue(que);return 0;
    }
    
运行结果

在这里插入图片描述

应用场景

  • 缓冲
  • 广度优先搜索(BFS)
  • . . .

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二节 字符串、列表

字符串 字符串的切片 使用[ : ]截取&#xff0c;左闭右开&#xff0c;示例&#xff1a; str"nihao" print(str[0:3]) 第一个参数省略默认从头开始&#xff0c;第二个参数省略默认截取到末尾 当第二个参数或第三个参数为-1时&#xff0c;从右向左取值&#xff0c…

【NLP 22、语言模型 language model】

有时候我也想听听&#xff0c;我在你心里&#xff0c;是什么样子 —— 25.1.12 一、什么是语言模型 语言是灵活的&#xff0c;也是有规律的 了解一门语言的人可以判断一句话是否“合理” 通俗来讲&#xff0c;语言模型用来评价一句话(句子可以看作是字的组合)是否“合理”或…

【CSS进阶】常见的页面自适应的方法

在前端开发中&#xff0c;自适应布局&#xff08;Responsive Design&#xff09;是一种让网页能够适应不同屏幕尺寸、设备和分辨率的技术。常见的自适应布局方法包括 流式布局、弹性布局&#xff08;Flexbox&#xff09;、栅格布局&#xff08;Grid&#xff09;、媒体查询&…

通过openresty和lua实现随机壁纸

效果&#xff1a; 图片存放路径&#xff1a; /home/jobs/webs/imgs/ ├── default/ │ ├── image1.jpg │ ├── image2.png ├── cats/ │ ├── cat1.jpg │ ├── cat2.gif ├── dogs/ │ ├── dog1.jpg访问http://demo.com/imgs/default 随机返回…

CAS单点登录(第7版)20.用户界面

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 用户界面 概述 概述 对 CAS 用户界面 &#xff08;UI&#xff09; 进行品牌化涉及编辑 CSS 样式表以及一小部分相对简单的 HTML 包含文件&#xff0c;也称为视图。&#xff08;可选&…

安全测试中的身份认证与访问控制深度解析

第一部分:基本概念与核心问题 1. 身份认证与访问控制基础 1.1 身份认证三要素 知识因素(密码、PIN码)持有因素(硬件令牌、手机)生物因素(指纹、面部识别)1.2 访问控制模型 DAC(自主访问控制)MAC(强制访问控制)RBAC(基于角色的访问控制)2. 关键安全机制 2.1 会话…

AI 编程工具—Cursor 进阶篇 数据分析

AI 编程工具—Cursor 进阶篇 数据分析 上一节课我们使用Cursor 生成了北京房产的销售数据,这一节我们使用Cursor对这些数据进行分析,也是我们尝试使用Cursor 去帮我们做数据分析,从而进一步发挥Cursor的能力,来帮助我们完成更多的事情 案例一 房产销售数据分析 @北京202…

算法1-1 玩具谜题

题目描述 小南有一套可爱的玩具小人&#xff0c;它们各有不同的职业。 有一天&#xff0c;这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈&#xff0c;它们有的面朝圈内&#xff0c;有的面朝圈外。如下图&#xff1a; 这时 singer 告诉小南一个谜题&…

Java函数计算冷启动从8s到800ms的优化实录

在函数计算场景中,冷启动性能对用户体验至关重要。本文将分享如何将 Java 函数计算的冷启动时间从 8 秒优化到 800 毫秒,包括具体的技术手段和代码示例。 一、背景介绍 函数计算是一种事件驱动的计算服务,用户只需上传代码,无需管理服务器。但在实际使用中,函数计算的冷…

《AI大模型开发笔记》deepseek提示词技巧

为什么你的 AI 助手总是答非所问&#xff1f; 「写篇产品分析」 → 收到一堆不知所云的文字 「做个竞品对比」 → 得到几页没有重点的废话 揭秘&#xff1a;不是 AI 不够聪明&#xff0c;而是你的指令太“高冷”&#xff01; 一、新手进阶&#xff1a; 5 大法则&#xff0c;让…

二、OpenSM排障----实战生产

目录 一、确认 OpenSM 服务端故障的步骤 1. 检查客户端与服务器的连通性 2. 检查客户端 InfiniBand 接口状态 3. 检查子网管理器状态 4. 检查拓扑信息 5. 检查路由表 二、客户端日志位置及查看方法 1. 系统日志 2. OpenSM 客户端日志 3. 内核日志 4. 性能计数器日志…

[矩形绘制]

矩形绘制 真题目录: 点击去查看 E 卷 200分题型 题目描述 实现一个简单的绘图模块,绘图模块仅支持矩形的绘制和擦除 当新绘制的矩形与之前的图形重叠时,对图形取并集当新擦除的矩形与之前的图形重叠时,对图形取差集给定一系列矩形的绘制和擦除操作,计算最终图形的面积。 …

在软件产品从开发到上线过程中,不同阶段可能出现哪些问题,导致软件最终出现线上bug

在软件产品从开发到上线的全生命周期中&#xff0c;不同阶段都可能因流程漏洞、技术疏忽或人为因素导致线上问题。以下是各阶段常见问题及典型案例&#xff1a; 1. 需求分析与设计阶段 问题根源&#xff1a;业务逻辑不清晰或设计缺陷 典型问题&#xff1a; 需求文档模糊&#…

渲染相机设置 pyrender cameralib

目录 cameralib 设置相机 numpy获取相机参数: pyrender设置相机: hmr2渲染设置 multi_hmr获取cam_t cameralib 设置相机 cameralib安装教程: cameralib 安装-CSDN博客 import cameralibcamera = cameralib.Camera.from_fov(fov_degrees=55, imshape=(720,1280))intri…

ros:ur机械臂初识

这是用来可视化的launch文件 比如&#xff0c;我运行 roslaunch ur_description view_ur3.launch ur3模型 ur3e模型 ur5模型 ur5e模型 ur10模型 ur20模型 ur30模型 后来我搜了一下 UR5 和 UR10 都是由 Universal Robots&#xff08;简称 UR&#xff09;生产的协作机器人&…

【VSCode】一键清理旧版本插件脚本(Mac或者Windows都可)

文章目录 清理VSCode旧版本插件为什么会有旧版本插件Mac 环境脚本源码原理解释实例解释 Windows 环境 清理VSCode旧版本插件 为什么会有旧版本插件 vscode 插件经常需要更新的&#xff0c;有时候更新之后旧版本的插件还是会留存在插件文件夹中&#xff08;更新插件之后vscode…

制作一个项目用于研究elementUI的源码

需求&#xff1a;修改el-tooltip的颜色&#xff0c;发现传递参数等方法都不太好用&#xff0c;也可以使用打断点的方式&#xff0c;但也有点麻烦&#xff0c;因此打算直接修改源码&#xff0c;把组件逻辑给修改了 第一步下载源码 源码地址 GitHub - ElemeFE/element: A Vue.j…

【ClickHouse】Ubuntu下离线安装ClickHouse数据库并使用DBeaver连接

目录 0. 安装前准备1 安装ClickHouse1.1 下载安装包1.2 离线安装1.3 配置密码1.4 启动ClickHouse服务 2 DBeaver连接配置2.1 下载ClickHouse驱动2.2 DBeaver配置2.2.1 配置主要参数2.2.2 配置驱动 2.3 常见问题处理2.3.1 修改远程登录配置2.3.2 更新驱动配置 0. 安装前准备 有…

unity学习36:老版的动画 Animation

目录 1 unity关于动画的分为两种 2 旧版动画 Animation 2.1 添加Animation组件 2.2 对应的动画clip 2.3 动画的属性 3 如何做出一个简单动画 3.1 打开老的动画编辑器 3.2 Animation 窗口&#xff0c;拖到下面的game窗口一起 3.3 新建动画 3.4 动画编辑器 3.4.1 时间…

学习数据结构(9)栈和队列上

1.栈的概念 栈是一种特殊的线性表&#xff0c;只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作 的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出&#xff08;先进先出&#xff09;的原则 栈的插入操作叫做进栈/压栈/入栈&#xff…