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

【数据结构】(C语言):栈

栈:

  • 线性的集合。
  • 后进先出(LIFO,last in first out)。
  • 两个指针:指向栈顶和栈底。栈顶指向最后进入且第一个出去的元素。栈底指向第一个进入且最后一个出去的元素。
  • 两个操作:入栈(往栈尾添加元素),出栈(从栈尾取出元素)。
  • 可以使用链表实现,也可以使用数组实现。本文使用双链表举例。

入栈:往栈顶(栈尾部)添加元素。

(头指针:指向第一个元素。尾指针:指向最后的元素。)

 

出栈:从栈顶(栈尾部)删除元素。

(头指针:指向第一个元素。尾指针:指向最后的元素。)


C语言实现(双链表):

创建节点(结构体数据类型),并创建具体节点实例的函数:

// 节点(结构体数据类型)
typedef struct Node
{int value;                  // 存储数据为整数struct Node *next;          // 指向下一个数据的指针struct Node *prev;          // 指向上一个数据的指针
} LinkNode;                     // 别名LinkNode
// 创建具体节点实例的函数
LinkNode * createNode(int data)
{LinkNode *node = (LinkNode *)malloc(sizeof(LinkNode));     // 分配内存空间if(node == NULL){perror("Memory allocation failed");exit(-1);}node->value = data;node->prev = NULL;node->next = NULL;return node;
}

本文将头指针、尾指针和栈长度作为全局变量:

LinkNode *header = NULL;    // 头指针,指向第一个节点,初始化为NULL
LinkNode *tail = NULL;      // 尾指针,指向最后节点,初始化为NULL
int length = 0;             // 统计栈有多少元素,初始化为0

入栈:

// 入栈(往栈顶即尾部添加数据)
void push(int data)
{LinkNode *node = createNode(data);if(length == 0)      // 空栈,头指针和尾指针都指向新节点{header = node;tail = node;length++;return ;}tail->next = node;           // 原最后节点的下一个为新节点node->prev = tail;           // 新节点的上一个为原最后节点tail = node;                 // 尾指针指向新节点,即新节点为最后节点   length++;                    // 每添加一个元素,length+1
}

获取栈顶元素:

int gettop(void)
{// 栈不为空,则栈顶元素为尾指针指向的最后节点的值if(length != 0) return tail->value;
}

出栈:

int pop(void)
{if(length != 0){// 获取最后节点的值int top = tail->value;// 通过最后节点的prev找到倒数第二个节点,其next指向NULL,则原倒数第二个节点为新的最后节点tail->prev->next = NULL;// 每删除一个节点,length-1length--;// 返回原最后节点的值return top;}
}

遍历栈:

void travel(void)
{if(length == 0) return ;LinkNode *cur = header;             // 从链表头部开始遍历,直到最后printf("stack elements:");while(cur != NULL){printf("%d \t", cur->value);cur = cur->next;}printf("\n");
}


完整代码:(stack.c)

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>/* structrue */
typedef struct Node         // node structure
{int value;struct Node *next;struct Node *prev;
} LinkNode;/* global variables */
LinkNode *header = NULL;    // the header pointer
LinkNode *tail = NULL;      // the tailer pointer
int length = 0;             // the number of the stack elements/* function prototype */
void push(int data);        // add element to the end of the stack
int pop(void);              // delete element from the end of the stack
int gettop(void);           // show element at the end of the stack
void travel(void);          // show element one by one/* main function */
int main(void)
{// cycle input a number until 'q' or non-numeric, add the number to the stackwhile(1)                              // 循环输入数字,并入栈,输入q退出输入循环{int data = 0, c;printf("if quit,input 'q'. Input a number: ");c = getchar();                     // 获取输入的一个字符if(tolower(c) == 'q') break;       // 若输入q,则退出输入循环if(c < '0' || c > '9') break;      // 输入的不是数字,则退出输入循环while(c != '\n')	     // 若整数为多位数,通过一位一位计算最终获得多位整数{data *= 10;data += c - 48;      // ASCII码表中,0对应码值48c = getchar();}push(data);             // 入栈printf("length is %d \n", length);           // 输出栈元素个数travel();                                    // 遍历栈}// when stack not empty,cycle look and delete the top element until input 'n'if(length == 0) exit(-1);char k;printf("if you want to look and delete the top element? (y/n) ");scanf(" %c", &k);             // 获取输入的内容while(tolower(k) == 'y' && length != 0)          // 循环输入是否查看并删除栈顶元素{printf("top element is %d \n", gettop());    // 输出栈顶元素pop();                                       // 出栈printf("length is %d \n", length);           // 输出栈元素个数travel();                                    // 遍历栈printf("if you want to look and delete the top element? (y/n) ");scanf(" %c", &k);                            // 获取下一个输入的内容}
}/* subfunction */
LinkNode * createNode(int data)         // create a node
{LinkNode *node = (LinkNode *)malloc(sizeof(LinkNode));if(node == NULL){perror("Memory allocation failed");exit(-1);}node->value = data;node->prev = NULL;node->next = NULL;return node;
}void push(int data)        // add element to the end of the stack
{LinkNode *node = createNode(data);if(length == 0){header = node;tail = node;length++;return ;}tail->next = node;node->prev = tail;tail = node;length++;
}int pop(void)              // delete element from the end of the stack
{if(length != 0){int top = tail->value;tail->prev->next = NULL;length--;return top;}
}int gettop(void)           // show element at the end of the stack
{if(length != 0) return tail->value;
}void travel(void)          // show element one by one
{if(length == 0) return ;LinkNode *cur = header;printf("stack elements:");while(cur != NULL){printf("%d \t", cur->value);cur = cur->next;}printf("\n");
}

 

编译链接: gcc -o stack stack.c

执行可执行文件: ./stack

相关文章:

【数据结构】(C语言):栈

栈&#xff1a; 线性的集合。后进先出&#xff08;LIFO&#xff0c;last in first out&#xff09;。两个指针&#xff1a;指向栈顶和栈底。栈顶指向最后进入且第一个出去的元素。栈底指向第一个进入且最后一个出去的元素。两个操作&#xff1a;入栈&#xff08;往栈尾添加元素…...

c++类成员指针用法

1&#xff09;C入门级小知识&#xff0c;分享给将要学习或者正在学习C开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 c中新增类成员指针操作&#xff0c;为了访问方便&#xff0c;他是指…...

[240625] Continue -- 开源 Copilot | Web-Check 网站分析工具 | Story of EOL

目录 Continue -- 开源 CopilotWeb-Check 网站分析工具Web-Check 提供全面的网站分析功能Web-Check 支持多种部署方式&#xff1a;配置选项开发环境Web-Check 使用多种数据源进行分析 Story of EOLASCII 文本中的换行符问题 Continue – 开源 Copilot 让 Continue 和 Ollama 成…...

【Mac】Auto Mouse Click for Mac(高效、稳定的鼠标连点器软件)软件介绍

软件介绍 Auto Mouse Click for Mac 是一款专为 macOS 平台设计的自动鼠标点击软件&#xff0c;它可以帮助用户自动化重复的鼠标点击操作&#xff0c;从而提高工作效率。以下是这款软件的主要特点和功能&#xff1a; 1.自动化点击操作&#xff1a;Auto Mouse Click 允许用户录…...

javaSE知识点整理总结(下)、MySQL数据库

目录 一、异常 1.常见异常类型 2.异常体系结构 3.异常处理 &#xff08;1&#xff09;finally &#xff08;2&#xff09;throws 二、JDBC 1.JDBC搭建 2.执行SQL语句两种方法 三、MySQL数据库 1.ddl 2.dml 3.dql &#xff08;1&#xff09;字符函数 &#xff08;…...

Perl入门学习

Perl是一种强大的脚本语言&#xff0c;以其灵活性和文本处理能力而闻名&#xff0c;常用于系统管理、Web开发、生物信息学以及数据处理等领域。以下是Perl语言入门学习的一些关键点&#xff1a; ### 1. Perl简介 - **起源与特点**&#xff1a;Perl由Larry Wall在1987年创建&am…...

2024年7月计划(ue5肉鸽视频完成)

试过重点放在独立游戏上&#xff0c;有个indienova独立游戏团队是全职的&#xff0c;由于他们干了几个月&#xff0c;节奏暂时跟不上&#xff0c;紧张焦虑了。五一时也有点自暴自弃了&#xff0c;实在没必要&#xff0c;按照自己的节奏走即可。精力和时间也有限&#xff0c;放在…...

恢复策略(上)-撤销事务(UNDO)、重做事务(REDO)

一、引言 利用前面所建立的冗余数据&#xff0c;即日志和数据库备份&#xff0c;要将数据库从一个不一致的错误状态恢复到一个一致性状态&#xff0c;还需要相关的恢复策略&#xff0c;不同DBMS的事务处理机制所采用的缓冲区管理策略可能不同&#xff0c;发生故障后的数据库不…...

【鸿蒙学习笔记】位置设置

官方文档&#xff1a;位置设置 目录标题 align&#xff1a;子元素的对齐方式direction&#xff1a;官方文档没懂&#xff0c;看图理解吧 align&#xff1a;子元素的对齐方式 Stack() {Text(TopStart)}.width(90%).height(50).backgroundColor(0xFFE4C4).align(Alignment.TopS…...

41.HOOK引擎设计原理

上一个内容&#xff1a;41.HOOK引擎设计原理 在一个游戏里通过hook来完成各种各样的功能&#xff0c;比如hook点是a、b、c&#xff0c;然后a点会有它自己所需要的hook逻辑&#xff0c;b、c也是有它们自己的hook逻辑&#xff08;hook逻辑指的是hook之后要做的事&#xff09;&am…...

STM32启动流程 和 map文件的作用

一&#xff0c;启动流程 1. 复位/上电 2. 根据 BOOT0/BOOT1 确定程序从哪个存储位置执行 3. 初始化 SP 及 PC 指针 将 0X08000000 位置的栈顶地址存放在 SP 指针中 将 0x08000004 位置存放的向量地址装入 PC 程序计数器 4. 初始化系统时钟 5. 初始化用户堆栈 6. 进入main函数 二…...

深度解析华为仓颉语言

什么是华为仓颉语言&#xff1f; 华为仓颉语言&#xff08;Huawei Cangjie Language&#xff0c;HCL&#xff09;是华为公司推出的一种新型编程语言&#xff0c;旨在解决大规模分布式系统开发中的复杂性问题。仓颉语言以高效、简洁和易用为设计目标&#xff0c;特别适用于云计…...

Android简介-历史、API等级与体系结构

1. Android简介 Android是一种基于Linux内核的自由及开放源代码的操作系统。最初是由安迪鲁宾(Andy Rubin)开发的一款相机操作系统。2005年8月被Google收购。2007年11月&#xff0c;Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。…...

SpringBoot:使用Spring Batch实现批处理任务

引言 在企业级应用中&#xff0c;批处理任务是不可或缺的一部分。它们通常用于处理大量数据&#xff0c;如数据迁移、数据清洗、生成报告等。Spring Batch是Spring框架的一部分&#xff0c;专为批处理任务设计&#xff0c;提供了简化的配置和强大的功能。本文将介绍如何使用Spr…...

用JQueryUI库在.net MVC中配置datepicker(时间日期控件)

原文参考&#xff1a;如何在MVC中添加jQuery Datepicker_mvc datepicker-CSDN博客 好文章被埋没了&#xff0c;可能和时间发的早有关。 1.首先我们引入JQuery和JQuery UI <!-- ... --> <link rel"stylesheet" href"https://code.jquery.com/ui/1.12…...

算法:链表

目录 链表的技巧和操作总结 常用技巧&#xff1a; 链表中的常用操作 题目一&#xff1a;反转一个单链表 题目二&#xff1a;链表的中间结点 题目三&#xff1a;返回倒数第k个结点 题目四&#xff1a;合并两个有序链表 题目五&#xff1a;移除链表元素 题目六&#xff…...

Redis基础教程(一):redis配置

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…...

短视频矩阵系统:打造品牌影响力的新方式

一、短视频矩阵概念 短视频营销革命&#xff1a;一站式解决策略&#xff01;短视频矩阵系统是一款专为企业营销设计的高效工具&#xff0c;旨在通过整合和优化众多短视频平台资源&#xff0c;为企业呈现一个全面的短视频营销策略。该系统致力于协助企业以迅速且高效的方式制作…...

品牌推广的三个阶段与核心内容,一篇文章全掌握!

在竞争激烈的市场环境中&#xff0c;品牌推广是企业成功的关键。精心策划的推广策略能够帮助企业在消费者心中树立独特的品牌形象&#xff0c;进而促进销售增长。 作为一家手工酸奶品牌的创始人&#xff0c;目前全国也复制了100多家门店&#xff0c;我理解的品牌推广分为3个阶…...

队列与循环队列

目录 1. 前言&#xff1a; 2. 队列 2.1 队列的概念 2.2 队列的实现 2.3 队列的声明 2.4 队列的初始化 2.5 队列的入队 2.6 队列的出队 2.7 队列获取队头元素 2.8 队列获取队尾元素 2.9 队列获取有效数据个数 2.10 队列判断是否为空 2.11 打印队列 2.12 销毁队列 …...

SenseVoice语音识别镜像深度体验:自动语言检测+高效推理,实测效果惊艳

SenseVoice语音识别镜像深度体验&#xff1a;自动语言检测高效推理&#xff0c;实测效果惊艳 1. 开箱即用的语音识别体验 当我第一次启动SenseVoice语音识别镜像时&#xff0c;最直观的感受就是"快"。这个基于ONNX量化的多语言语音识别服务&#xff0c;从启动到可用…...

手机端能用嘎嘎降AI吗:移动端使用完整指南和注意事项

手机端能用嘎嘎降AI吗&#xff1a;移动端使用完整指南和注意事项 上周室友第一次用降AI工具&#xff0c;操作错了好几步&#xff0c;差点浪费机会。觉得有必要写一篇详细教程。 我用的是嘎嘎降AI&#xff08;www.aigcleaner.com&#xff09;&#xff0c;4.8元一篇&#xff0c…...

Claude HUD:AI开发效率的实时状态监控工具

Claude HUD&#xff1a;AI开发效率的实时状态监控工具 【免费下载链接】claude-hud A Claude Code plugin that shows whats happening - context usage, active tools, running agents, and todo progress 项目地址: https://gitcode.com/GitHub_Trending/cl/claude-hud …...

别再只建桶了!华为云OBS的5个高阶配置,让你的存储成本直降30%

别再只建桶了&#xff01;华为云OBS的5个高阶配置&#xff0c;让你的存储成本直降30% 当你的业务数据量突破TB级时&#xff0c;存储成本就会像野马一样失控。去年我们团队就经历过这样的教训——每月OBS账单突然暴涨40%&#xff0c;排查后发现是数百GB的过期日志仍按标准存储计…...

MuseV虚拟人生成终极指南:从零开始创建高质量虚拟人视频

MuseV虚拟人生成终极指南&#xff1a;从零开始创建高质量虚拟人视频 【免费下载链接】MuseV MuseV: Infinite-length and High Fidelity Virtual Human Video Generation with Visual Conditioned Parallel Denoising 项目地址: https://gitcode.com/GitHub_Trending/mu/Muse…...

不用标注数据!手把手教你用SAM 3和SegEarth-OV3搞定遥感图像分割(附避坑指南)

零标注实战&#xff1a;用SAM 3与SegEarth-OV3实现遥感图像智能分割 当你在处理城市违建排查任务时&#xff0c;面对海量航拍图却找不到足够标注数据&#xff1b;当突发自然灾害需要快速评估受损区域&#xff0c;但现有模型无法识别新型地物——这些正是遥感图像分析中最棘手的…...

C++的std--ranges适配器视图元素类型推导规则与用户自定义类型

C20引入的std::ranges库彻底改变了序列操作的范式&#xff0c;其中适配器视图通过惰性求值和管道操作符实现了高效的函数式编程。当开发者尝试将用户自定义类型融入这套体系时&#xff0c;元素类型推导的复杂规则往往成为技术深水区。本文将揭示适配器视图背后的类型魔法&#…...

RAG系统意图识别模块设计与实现思路

前言在RAG&#xff08;检索增强生成&#xff09;系统的实际应用中&#xff0c;我们经常会遇到一个问题&#xff1a;所有用户问题都走相同的检索-生成流程。这会导致闲聊问题浪费检索资源、分析型问题检索不足、操作型问题无法正确处理等一系列问题。本文将介绍如何在RAG系统中加…...

Phi-3-vision-128k-instruct创意编程:用JavaScript构建交互式图像故事生成器

Phi-3-vision-128k-instruct创意编程&#xff1a;用JavaScript构建交互式图像故事生成器 1. 引言&#xff1a;当AI创意遇上前端交互 想象这样一个场景&#xff1a;用户上传一张随手拍的照片&#xff0c;通过简单的滑块调整和风格选择&#xff0c;几秒钟后就能获得一个与图片内…...

Qwen-Image-2512-Pixel-Art-LoRA 跨界创作:生成像素风音乐专辑封面与海报

Qwen-Image-2512-Pixel-Art-LoRA 跨界创作&#xff1a;生成像素风音乐专辑封面与海报 最近在玩一个挺有意思的AI工具&#xff0c;叫Qwen-Image-2512-Pixel-Art-LoRA。名字有点长&#xff0c;但功能很直接&#xff0c;就是专门生成像素艺术。我琢磨着&#xff0c;像素风这种复古…...