【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;如下 比如&…

PoW算法,请出示你的证明

口信消息型拜占庭问题的解可以防止 (n - 1) / 3 个坏人 (其中 n 为节点数)作恶&#xff0c;这样一来也是可以通过不断增加节点数来突破 (n - 1) / 3 的限制。为了防止这一行为可以使用区块链技术中的工作量证明&#xff08;Proof of Work&#xff09;算法。 原理 PoW算法&…

devc++跑酷小游戏1.2.5

更新了在关卡中的复位和地图的刷新z或Z&#xff0c;存档还是没写出来&#xff0c;文件操作好难&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;…

【leetcode热题100】解码方法

难度&#xff1a; 中等通过率&#xff1a; 21.5%题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目描述 一条包含字母 A-Z 的消息通过以下方式进行了编码&#xff1a; A -> 1 B -> 2 ... Z -> 26给定一个只包含数字…

continue、break、return的区别

continue、break、return的区别 continuebreakreturn continue 作用&#xff1a;跳过本次循环&#xff0c;继续接下来的循环 for(int i 1;i < 10;i){if(i4){continue;}System.out.print(i " "); } //输出结果为&#xff1a;1 2 3 5 6 7 8 9 10 //4的输出被跳过…

C#中 Combine 静态方法

在C#中&#xff0c;Combine是System.IO.Path类的一个静态方法&#xff0c;用于将多个路径片段组合成一个完整的路径。 Combine方法的详细解释如下&#xff1a; public static string Combine(string path1, string path2);参数&#xff1a; path1&#xff1a;要组合的第一个…

【手写数据库toadb】数据字典的内容结构,它的生成,避免鸡生蛋蛋生鸡的问题,高频访下的性能应对

411 数据字典的作用 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方…

【好玩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…

已解决ModuleNotFoundError: No module named ‘PIL‘异常的正确解决方法,亲测有效!!!

已解决ModuleNotFoundError: No module named PIL异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 文章目录 问题分析 报错原因 解决思路 解决方法 总结 Python是一个强大的编程语言&#xff0c;拥有丰富的第三方库来扩展它的功能。但有时&…

【笔记】Helm-5 Chart模板指南-13 调是模版

调试模板 调试模板可能很棘手&#xff0c;因为渲染后的模板发送了kubernetes API server&#xff0c;可能会以格式化以外的原因拒绝YAML文件。 以下命令有助于调试&#xff1a; 1、helm lint 是验证chart是否遵循最佳实践的首选工具。 2、helm template --debug在本地测试渲…

Python Flask Web 框架学习笔记+完整项目

Flask是一个轻量级的基于Python的web框架。 我们建议使用最新版本的 Python。Flask 支持 Python 3.8 及更高版本。 官网&#xff1a;欢迎使用 Flask — Flask 文档 &#xff08;3.0.x&#xff09; (palletsprojects.com) 完整项目&#xff1a; 1.简介 Flask 是一个轻量级的…

【实验2】在Hadoop平台上部署WordCount程序

文章目录 实验内容一、实验环境:二、实验内容与步骤(过程及数据记录):5. 分布式文件系统HDFS上的操作5.1 利用Shell命令与HDFS进行交互5.2 利用Web界面管理HDFS6. 分布式文件系统HDFS上的编程实践6.1 安装Eclipse6.2 创建Eclipse工程6.3 编写一个Java应用程序检测HDFS中是否…

敏捷开发和传统开发的区别及工具分享

敏捷开发和传统开发的区别主要体现在以下几个方面&#xff1a; 团队建设不同&#xff1a;敏捷开发以团队为单位&#xff0c;强调团队建设&#xff0c;赋予高度的责任&#xff0c;支持开发、透明的交流环境&#xff1b;传统开发以个人为单位&#xff0c;团队成员之间交付很少。…

201709CSPT5除法

题意&#xff1a;有一个长度为 n n n的序列,对其有 m m m个操作&#xff1a; 1 : 对 [ L , R ] 1:对[L,R] 1:对[L,R]之间所有 v v v的倍数除以 v v v 2 : 对 [ L , R ] 2:对[L,R] 2:对[L,R]之间所有求和 #include<bits/stdc.h> using namespace std; struct node {lon…