【C语言】实现栈


目录

(一)栈

(二)头文件 

(三)功能实现

(1)初始化栈

(2) 栈的销毁

(3)压栈

(4) 出栈

(5) 取出栈顶元素

(6)判断栈是否为空

(7)得到栈的数据个数


 

正文开始:

(一)栈

        栈是一种常见的数据结构,遵循“后进的数据先出”(Lsat In First Out)的原则。

        栈有两个主要的操作:入栈和出栈。入栈(push)操作将一个元素添加到栈的顶部,而出栈(pop)操作则将栈顶的元素移除。

        栈可以用于解决各种问题,例如实现函数调用栈、表达式求值、回溯算法等。在计算机内存中,栈也常用于存储函数的局部变量、函数调用的上下文信息以及程序的返回地址等。

        栈通常可以使用数组或链表等数据结构来实现。

        使用数组实现的栈称为顺序栈,它具有固定大小的容量;

        而使用链表实现的栈称为链式栈,它可以动态地增长和缩小。

        除了入栈和出栈操作,栈还可以提供其他常见的操作,如获取栈顶元素(top)和判空(isEmpty)。此外,还可以通过计算栈的长度来得知栈中元素的数量。

        

(二)头文件 

         本文根据Cpp的STL来实现栈的相关功能:包括栈的初始化,销毁,压栈,出栈,得到栈顶元素,判断栈是否为空,得到栈内元素个数等共七个功能。

        头文件如下:

        命名:Stack.h

         栈可以用顺序表实现,也可以用链表实现(由于单链表尾插效率低,所以用单链表的头作为栈顶);

        本文基于顺序表实现栈;

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
//栈数据类型
typedef int StackDatatype;//一个栈
typedef struct Satck
{StackDatatype* a;int top;int capacity;
}SK;
//初始化
void STInit(SK* st);//销毁
void STDestory(SK* st);//压栈
void STPush(SK* st,StackDatatype x);//出栈
void STPop(SK* st);//取出栈顶元素
StackDatatype STTop(SK* st);//栈是否空
bool STEmpty(SK* st);//得到栈的数据个数
int STSize(SK* st);

(三)功能实现

(1)初始化栈

初始化栈

        首先函数接收的指针不为空(否则无法解引用),通过assert断言完成;

        顺序表数组置空,容量(capacity)和栈顶下一个元素的下标(top)都为0(top表示栈顶元素的下一个元素的下标,top==0表示此时栈内没有任何元素);


//初始化
void STInit(SK* st)
{assert(st);st->a = NULL;st->capacity = st->top = 0;
}

(2) 栈的销毁

 销毁栈

        首先函数接收的指针不为空(否则无法解引用),通过assert断言完成;

        顺序表动态申请的数组释放掉,并置空;

        容量和栈顶元素都置0;


//销毁
void STDestory(SK* st)
{assert(st);st->capacity = st->top = 0;free(st->a);st->a = NULL;
}

(3)压栈

         由于栈基于顺序表实现,所以需要判断顺序表是否已经满了,如果栈顶下一个元素的下标等于此时容量,表明栈已满,需要扩容;

        Newcapacity的赋值通过三目操作符实现:如果capacity为初始值0,Newcapacity赋值为4,否则赋值为2*capacity;

        如果realloc申请失败,打印错误信息并返回;

        若申请成功,压入数据;

//压栈
void STPush(SK* st, StackDatatype x)
{assert(st);if (st->capacity == st->top){int Newcapacity = st->capacity == 0 ? 4 : st->capacity * 2;StackDatatype* tem = (StackDatatype*)realloc(st->a, sizeof(StackDatatype) * Newcapacity);if (tem == NULL){perror("realloc fail!");return;}st->a = tem;st->capacity = Newcapacity;}st->a[st->top++] = x;}

(4) 出栈

        首先函数接收的指针不为空(否则无法解引用),通过assert断言完成;

        其次,栈不为空;

        只需top--,就实现了出栈操作(不需要抹除数据,因为出栈的数据已经无法通过正常方法访问了);


//出栈
void STPop(SK* st)
{assert(st);assert(!STEmpty(st));st->top--;
}

(5) 取出栈顶元素

        首先函数接收的指针不为空(否则无法解引用),通过assert断言完成;

        其次,栈不为空;

        直接返回栈顶元素(top是栈顶元素的下一个元素的下标);

//取出栈顶元素
StackDatatype STTop(SK* st)
{assert(st);assert(!STEmpty(st));return st->a[st->top-1];
}

 

 

(6)判断栈是否为空

        首先函数接收的指针不为空(否则无法解引用),通过assert断言完成;

        这里返回判断表达式的值,表达式成立值为真(1),否则值为假(0);【这是很巧妙的写法】


//栈是否空
bool STEmpty(SK* st)
{assert(st);return st->top == 0;
}

 

(7)得到栈的数据个数

         首先函数接收的指针不为空(否则无法解引用),通过assert断言完成;

        返回数据个数(下标从0开始,数据个数就是栈顶元素下一个元素的下标);


//得到栈的数据个数
int STSize(SK* st)
{assert(st);return st->top;
}

完~

未经作者同意禁止转载 

 

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

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

相关文章

【html学习笔记】1.概念

1.概念 1.1 HTML标准格式 <html><body><p>Hello World</p></body> </html>1.2 编辑方式 新建一个笔记本文件&#xff0c;将html语法格式的内容写入。保存后将记事本的.txt后缀换成.html,就可以在浏览器里运行了 1.3 中文问题 为了避…

前端架构: 从vue-cli探究脚手架原理

从使用角度理解什么是脚手架 脚手架本质是一个操作系统的客户端 在终端中去执行一个命令&#xff0c;这个命令本身它就是一个客户端我们其实可以把脚手架理解为操作系统的一个客户端通过命令去执行它的时候&#xff0c;这个命令往往是这样的一个构造&#xff0c;如下 比如&…

【好玩AI】【Prompt】情人节了,用GPT写个【骂醒恋爱脑】的机器人跟自己对话吧

情人节了&#xff0c;让我们用GPT写个【骂醒恋爱脑】的机器人跟自己对话吧。 通过本文&#xff0c;你能学到&#xff1a; 1. 如何零代码搭建一个自己的机器人Bot 2. 骂醒恋爱脑的高级Prompt 通过本文&#xff0c;你还能得到&#xff1a; 恋爱脑可能被骂醒 为了白嫖&#xff0c;…

Linux下的多线程

前面学习了进程、文件等概念&#xff0c;接下里为大家引入线程的概念 多线程 线程是什么&#xff1f;为什么要有线程&#xff1f;线程的优缺点Linux线程操作线程创建线程等待线程终止线程分离 线程间的私有和共享数据理解线程库和线程id深刻理解Linux多线程&#xff08;重点&a…

【selenium】

selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的。Selenium可以直接调用浏览器&#xff0c;它支持所有主流的浏览器。其本质是通过驱动浏览器&#xff0c;完成模拟浏览器操作&#xff0c;比如挑战&#xff0c;输入&#xff0c;点击等。 下载与打…

算法刷题:快乐数

快乐数 .习题链接题目题目解析初始值算法原理我的答案 . 习题链接 快乐数 题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1…

【C语言】解析刘谦春晚魔术《守岁共此时》

今年的春晚上刘谦表演了魔术《守岁共此时》&#xff0c;台上台下积极互动&#xff08;尤其是小尼&#xff09;&#xff0c;十分的有趣。刘谦老师的魔术不仅仅是他的高超手法&#xff0c;还有这背后的严谨逻辑&#xff0c;下面我们来用C语言来解析魔术吧。 源代码 #define _CRT…

单页404源码

<!doctype html> <html> <head> <meta charset"utf-8"> <title>简约 404错误页</title><link rel"shortcut icon" href"./favicon.png"><style> import url("https://fonts.googleapis.co…

SVD奇异值分解

一、奇异值 奇异值&#xff08;Singular Values&#xff09;是线性代数中矩阵的重要性质之一&#xff0c;与奇异值分解&#xff08;SVD&#xff09;密切相关。让我们来更详细地了解一下奇异值的概念&#xff1a; 定义&#xff1a; 对于一个矩阵 ( A )&#xff0c;它的奇异值是…

夜天之书 #95 GreptimeDB 社群观察报告

GreptimeDB 是格睿科技&#xff08;Greptime&#xff09;公司研发的一款开源时序数据库&#xff0c;其源代码[1]在 GitHub 平台公开发布。 https://github.com/GreptimeTeam/greptimedb 我从 2022 年开始知道有 GreptimeDB 这个项目。2023 年&#xff0c;我注意到他们的 Commun…

Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权

目录: OpenID 与 OAuth2 基础知识Blazor wasm Google 登录Blazor wasm Gitee 码云登录Blazor OIDC 单点登录授权实例1-建立和配置IDS身份验证服务Blazor OIDC 单点登录授权实例2-登录信息组件wasmBlazor OIDC 单点登录授权实例3-服务端管理组件Blazor OIDC 单点登录授权实例4 …

在线问诊系统设计与实现的经验总结与整理

随着互联网技术的快速发展&#xff0c;在线问诊服务作为一种新兴的医疗服务模式&#xff0c;正逐渐受到人们的关注和使用。本文将介绍在线问诊系统的设计原则和关键组件&#xff0c;以及如何实现一个安全、高效和可扩展的在线医疗服务平台。 内容&#xff1a; 1. 引言 - 在…

团队配置管理规范浅见

在一段时间的工作过程中配置管理工作确实对我们的生产活动产生了巨大的工作量&#xff0c;现在就这个工作来进行梳理一下。 本文主要分为两部分&#xff1a; 1、借用软件系统分析师的配置管理部分内容来介绍配置管理的工作&#xff08;原谅时间精力有限&#xff0c;原文基本已…

Qt窗口坐标体系

通过以上代码可以看出Qt的坐标体系。 以左上角为原点&#xff08;0,0&#xff09;&#xff0c;以向右的方向为x轴的正方向&#xff0c;以向下方向为y轴的正方向。 对于嵌套窗口&#xff0c;其坐标是相对于父窗口来说的。顶层窗口的父窗口就是屏幕。

day 20(补2.5)

fread 函数&#xff1a; 今日练习 C语言面试题5道~ 1. static 有什么用途&#xff1f;&#xff08;请至少说明两种&#xff09; 1) 限制变量的作用域 2) 设置变量的存储域 2. 引用与指针有什么区别&#xff1f; 1) 引用必须被初始化&#xff0c;指针不必。 2) 引用初始…

【Java程序设计】【C00266】基于Springboot的超市进存销管理系统(有论文)

【Java程序设计】【C00266】基于Springboot的超市进存销管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的超市进销存系统 本系统分为登录注册模块、管理员功能模块以及员工功能模块。 登录注册模块&#…

《Linux 简易速速上手小册》第8章: 安全性与加固(2024 最新版)

文章目录 8.1 防火墙与安全策略8.1.1 重点基础知识8.1.2 重点案例&#xff1a;配置 iptables 以保护 Web 服务器8.1.3 拓展案例 1&#xff1a;使用 firewalld 配置动态防御区域8.1.4 拓展案例 2&#xff1a;配置 ufw 以简化管理 8.2 SSH 安全最佳实践8.2.1 重点基础知识8.2.2 重…

JAVA设计模式之命令模式详解

命令模式 1 命令模式介绍 命令模式(command pattern)的定义: 命令模式将请求&#xff08;命令&#xff09;封装为一个对象&#xff0c;这样可以使用不同的请求参数化其他对象&#xff08;将不同请求依赖注入到其他对象并且能够支持请求&#xff08;命令&#xff09;的排队执行…

STM32 寄存器操作 GPIO 与中断

一、如何使用stm32寄存器点灯&#xff1f; 1.1 寄存器映射表 寄存器本质就是一个开关&#xff0c;当我们把芯片寄存器配置指定的状态时即可使用芯片的硬件能力。 寄存器映射表则是开关的地址说明。对于我们希望点亮 GPIO_B 的一个灯来说&#xff0c;需要关注以下的两个寄存器…

【C语言期末项目-通讯录】-升级可动态申请内存版(手把手详细过程,期末评分A+的项目,答辩辅助神博文,建议三连点赞收藏)

目录 ​编辑 前言&#xff1a; 1.项目功能需求分析 2.文件框架说明 3.程序主框架实现 4.创建联系人结构体类型和通讯录结构体类型 4.1创建通讯录 5.程序功能实现--封装功能函数实现不同功能 5.1通讯录初始化 5.2增加联系人 5.3显示所有联系人的信息 5.4删除指定…