当前位置: 首页 > news >正文

栈与队列(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)
  • . . .

相关文章:

栈与队列(C语言版)

文章目录 栈与队列1. 栈基本操作实现(基于链表)代码运行结果 应用场景 2. 队列基本操作实现代码运行结果 应用场景 栈与队列 1. 栈 栈是一种操作受限的线性结构。操作受限体现在&#xff0c;栈只能在一端添加和删除元素&#xff0c;符合后进先出 ( LIFO ) 的特性&#xff0c;…...

stl里的deque 中控map 假如用完了,该如何处理

在 C 的标准模板库&#xff08;STL&#xff09;中&#xff0c;std::deque&#xff08;双端队列&#xff09;使用一种分段连续的存储结构&#xff0c;通过一个中控器&#xff08;通常称为中控 map&#xff09;来管理多个固定大小的存储块&#xff08;缓冲区&#xff09;。当这个…...

Git GUI设置中文的方法及使用

链接: Git Bash和Git GUI设置中文的方法 链接: Git 基本操作...

代码书写常用快捷建

唤出剪切板 Windows 系统 &#xff1a;Win V Mac 系统&#xff1a; 在 Mac 电脑上&#xff0c;可以点击桌面菜单栏中的 “编辑”&#xff0c;在下拉菜单中选择 “显示剪贴板” 来打开剪贴板。 跳转和撤回跳转 在vscode软件中可以通过ctrl&#xff0b;鼠标左键可以进行跳转…...

MySQL 索引失效处理:原因分析与优化实战

MySQL 索引失效处理&#xff1a;原因分析与优化实战 MySQL 索引失效处理&#xff1a;原因分析与优化实战引言一、什么是索引失效&#xff1f;二、索引失效的常见原因2.1 查询条件中使用函数或表达式示例&#xff1a;原因&#xff1a; 2.2 数据类型不匹配示例&#xff1a;原因&a…...

基于Python的AI代码审计工具实现方案,结合DeepSeek API和商业化设计

以下是一个基于Python的AI代码审计工具实现方案&#xff0c;结合DeepSeek API和商业化设计&#xff0c;分为基础功能版和进阶扩展方向&#xff1a; 基础版实现代码 (命令行工具) import os import requests from dotenv import load_dotenv import hashlib import json from t…...

用Python实现线性回归:从数学原理到代码实战

一、前言&#xff1a;为什么线性回归是AI必修课&#xff1f; 作为机器学习领域的"Hello World"&#xff0c;线性回归算法具有三大核心价值&#xff1a; 1️⃣ 理解监督学习的底层逻辑&#xff08;特征工程→模型训练→预测输出&#xff09; 2️⃣ 掌握梯度下降等优化…...

系统可观测性(1)基础概念

系统可观测性(1)基础概念(Log/Tracing/Metrics) Author: Once Day Date: 2025年2月8日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 十年代码训练…...

Redis未授权访问漏洞导致getshell

一、漏洞信息 redis默认情况下会绑定在本地6379端口&#xff0c;如果没有进行采用相关的策略&#xff0c;就会将redis服务暴露到公网上&#xff0c;如果再没有设置密码认证(一般为空)的情况下&#xff0c;会导致任意用户可以访问到目标服务器的情况下未授权访问redis以及读取r…...

Electron 全面解析:跨平台桌面应用开发指南

引言 在当今多平台并存的数字时代&#xff0c;如何高效开发跨平台桌面应用成为开发者面临的重要挑战。Electron作为GitHub开源的跨平台框架&#xff0c;凭借其独特的Web技术融合能力&#xff0c;已成为构建桌面应用的热门选择。本文将深入探讨Electron的核心原理、开发实践及未…...

React进阶之React核心源码解析(一)

React核心源码解析 react 特点CPU卡顿IO 卡顿 新老 react 架构对比v15v16.8Scheduler 调度器Reconciler 协调器 React fiber原理更新dommount 构建过程 render阶段 — scheduler reconcilerreact源码解析react-domreact-dom/src/client/ReactDOMRoot.js react-reconcilerreact-…...

用大模型学大模型03-数学基础 概率论 条件概率 全概率公式 贝叶斯定理

要深入浅出地理解条件概率与贝叶斯定理&#xff0c;可以从以下几个方面入手&#xff0c;结合理论知识和实例进行学习&#xff1a; 贝叶斯定理与智能世界的暗语 条件概率&#xff0c;全概率公式与贝叶斯公式的推导&#xff0c;理解和应用 拉普拉斯平滑 贝叶斯解决垃圾邮件分类 …...

C++ Primer 参数传递

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

Jupyter lab 无法导出格式 Save and Export Notebook As无法展开

本来尝试jypyter lab如何导出HTML带有侧边导航栏&#xff0c;一顿操作后发现还是没实现。 又突然发现导出其他格式地功能不能用了&#xff0c;浏览器里Save and Export Notebook As展开按钮为灰色打不开。 经典想实现的没实现还把原先的搞坏了。 看了jupyter lab的运行信息发…...

Mac之JDK安装

Mac之JDK安装 一.安装 jdk 打开终端输入命令:java -version 查看是否已安装 JDK Oracle 官方下载地址 根据自己Mac 系统安装 查看 Mac 系统&#xff0c;打开中断命令&#xff0c;输入: uname -a Compressed Archive 是压缩文档&#xff0c;下载的是一个 .tar.gz 压缩包 D…...

OpenEuler学习笔记(三十一):在OpenEuler上搭建仓颉语言开发环境

仓颉语言&#xff08;Cangjie programming language&#xff09;相对较为小众&#xff0c;截至2025年&#xff0c;并没有广泛的资料和成熟的通用搭建流程。不过下面为你提供一个较为通用的在OpenEuler上搭建开发环境的大致思路&#xff0c;你可以根据实际情况进行调整。 1. 安…...

2021年全国研究生数学建模竞赛华为杯E题信号干扰下的超宽带(UWB)精确定位问题求解全过程文档及程序

2021年全国研究生数学建模竞赛华为杯 E题 信号干扰下的超宽带(UWB)精确定位问题 原题再现&#xff1a; 一、背景   UWB&#xff08;Ultra-Wideband&#xff09;技术也被称之为“超宽带”&#xff0c;又称之为脉冲无线电技术。这是一种无需任何载波&#xff0c;通过发送纳秒…...

【电脑】u盘重装win7

u盘必须8GB以上 1. CPU型号 首先查看CPU的型号看看到底能不能装win7 2. 下载光盘映像文件 网址 看电脑是多少位的机器(32位下载x86 64位下载x64) 一共是这么多个版本按需下载对应的版本 电脑小白推荐无脑下载旗舰版 将链接复制到迅雷进行下载 3. 下载软碟通 网址 下…...

HCIA项目实践--RIP的拓展配置

9.4.7 RIP的拓展配置 &#xff08;1&#xff09;RIPV2的手工认证 RIPv2 的手工认证是增强网络安全性的手段。管理员手动配置密钥&#xff0c;路由器在收发 RIPv2 路由更新消息时&#xff0c;会对消息中的认证信息进行检查。发送方添加密钥&#xff0c;接收方用预设密钥验证。若…...

常用架构图:业务架构、产品架构、系统架构、数据架构、技术架构、应用架构、功能架构及信息架构

文章目录 引言常见的架构图I 业务架构图-案例模块功能说明1. 用户界面层 (UI)2. 应用服务层3. 数据管理层4. 基础设施层业务流程图示例技术实现II 功能架构图 -案例功能模块说明1. 船舶监控模块2. 报警管理模块3. 应急响应模块4. 通信管理模块5. 数据分析模块数据管理层基础设施…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...