用c语言进行栈的实现

一、栈的概念

栈Stack:

        是只允许在一端进行插入或删除性表线。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作(类似于一个只有开口的瓶子)。(遵循LIFO原则)——后进先出(Last In First Out)

栈顶 Top:

         进行插入或者删除的那一端

栈底 Bottom:

        栈顶另一端

空栈:

        不含任何元素的空表

压栈 Push:

        栈的插入操作(还可以叫入栈,进栈)

出栈 Pop:

        栈的删除操作

图例说明:

如图,将数据一个一个压进去,相当瓶子,你倒水进去,就是先流入底部,一直到填满

你喝水,先喝的是上面的水,最后才喝底部的水,所以就是  先进后出

 你想想弹夹,装子弹是不是也是先放的子弹,最后才打出来

 既然如此:像子弹一样,想用下一个就会Pop(出栈)掉这颗子弹


 二、栈的实现:

涉及以下:

1、栈的初始化

2、压栈

3、出栈

4、判断是否为空

5、销毁

6、数据个数(可以写可以不写,我觉得写一下也行,能够知道压栈数据有几个)

7、取栈顶数据

以下三个数据结构都可以来创建栈

相比于双链表和单链表,更会倾向于单链表,因为栈是只有栈顶进行删除和增加,而双链表单链表每一个节点多一个指针

对于单链表:使用头插尾删尾插头删)来实现压栈和出栈

但是更倾向于选择顺序表,因为它的缺点虽然是扩容,但是也不是每次都要扩容,而且cpu的缓存利用率也高

三、改写顺序表实现:

1、创建栈

如下:和顺序表相同,但是,第二个参数由size(有效数据个数改成了栈顶top)

 2、初始化栈:

有个讲究了,对于top有2种取值,Top栈顶用来获取元素

若是栈顶是从0开始的话,那么,你放入第一个数据,此时Top=1,但是你的数据位于的下标是0 所以说Top指向的栈顶元素的下一个位置

若是栈顶从-1开始的话,同理,top=0,你的数据下标(元素)刚好是top指向的位置

如下图:

我就以top=0为例子了,另一种可以自己去试试

 3、压栈:

在顺序表时,都是一个原理,assert使用以及realloc使用之前就已经讲过了,不做赘述

 因为用的top=0,所以先将数据放入,再top++

4、出栈:

简单多了,和尾删差不多,就是直接将最后一个数据下标删掉,要断言一下top是否为0,因为你在>0的时候进来,就如:top为1,进入删除以后为0,下次再Pop就不对了,因为若是为0了,就不能删了,因为进来时top的值就是0,那么出栈以后top的初始值不能变

 5、判空:

用到了bool,若是为真(true)则返回1,假(false)返回0  还要一个<stdbool.h>的头文件

我用的p->top==0,若是不等于0,则为假返回0.若是等于 0为真返回1

 6、销毁:

栈的使用就是一次性,出栈一次就会走掉一个数据;因此出栈一个数据就会向底部走,最后Top会回到进来时的样子,然后销毁即可

7、数据个数:

让我们知道有几个数据

8、取出栈顶数据:

无非就是该位置数据传回去:

9、测试:

它的打印,不像之前顺序表的打印,用创建一个SLPrin()来遍历打印;而是通过while循环,每次进入循环都要Pop掉一个,因为我们的Pot指向的是下一个数据的位置,所以先Pop,再打印(防止越界访问哦)

 四、分装代码:

Stack.h文件:

#pragma once#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<assert.h>typedef int LTDataType;
//顺序表(栈)
typedef struct SL
{LTDataType* a;int top;int capacity;
}SL;
//入栈
void SLPush(SL* p, LTDataType x);
//出栈
void SLPop(SL* p);
//初始化
void SLInit(SL* p);
//销毁
void SLDestroy(SL* p);
//判空
bool SLEmpty(SL* p);
//数据个数
int SLsize(SL* p);
//取数据
LTDataType SLPot(SL* p);

Stack.c文件:

#define _CRT_SECURE_NO_WARNINGS 3#include"Stack.h"//入栈
void SLPush(SL* p,LTDataType x)
{//不能传NULL,判空;assert(p);if (p->top == p->capacity){//先判断是否为0,好进行扩容int newnode = p->capacity == 0 ? 4 : 2 * (p->capacity);//扩容;创建一个临时变量接收新的空间,成功在将其交给p->a;LTDataType* s = (LTDataType*)realloc(p->a,newnode * sizeof(LTDataType));if (s == NULL){perror("realloc");return;}p->a = s;p->capacity = newnode;}p->a[p->top] = x;//指向下一个数据地址p->top++;
}
//出栈(类似尾删)
void SLPop(SL* p)
{//是否为空assert(p);assert(p->top > 0);p->top--;
}
//初始化
void SLInit(SL* p)
{p->a = NULL;p->capacity = 0;//p->top = -1;//指向栈顶的数据p->top = 0;//指向栈顶的下一个数据
}
//销毁
void SLDestroy(SL* p)
{assert(p);free(p->a);p->a = NULL;p->capacity = p->top = 0;
}
//判空
bool SLEmpty(SL* p)
{//不能是空地址assert(p);//为0就是真(true),为1就是假(flase)return p->top == 0;
}
//数据个数
int SLsize(SL* p)
{int size = p->top;return size;
}
//取数据:
LTDataType SLPot(SL*p)
{assert(p);return p->a[p->top];
}

test.c文件:

#define _CRT_SECURE_NO_WARNINGS 3
#include"Stack.h"int main()
{SL pts;//初始化SLInit(&pts);//入栈SLPush(&pts, 1);SLPush(&pts, 2);SLPush(&pts, 3);SLPush(&pts, 4);while (!SLEmpty(&pts)){//指向的是下一个数据的位置,此时在栈顶,我要将先控制到数据位置;SLPop(&pts);printf("%d ",SLPot(&pts));}SLDestroy(&pts);return 0;
}

希望对你有帮助,今天也要好好学习哦!!!

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

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

相关文章

音视频知识基础篇----媒体格式

1. 流媒体&#xff08;Streaming media&#xff09; 流媒体&#xff1a;一连串的多媒体资料压缩后&#xff0c;经过互联网分段发送资料&#xff0c;在互联网上即时传输影音以供观赏的一种技术与过程&#xff0c;此技术使得资料数据包得以像流水一样发送&#xff0c;如果不使用此…

想让网站实现HTTPS访问?教你十分钟内实现

实现网站HTTPS访问通常遵循以下简明步骤&#xff1a; 1. 选择并申请SSL证书&#xff1a; - 根据网站需求&#xff0c;挑选合适的SSL证书类型。常见的有&#xff1a; - DV&#xff08;域名验证&#xff09;&#xff1a;适用于个人或小网站&#xff0c;仅验证域名所有权。 - OV&a…

html--互动星空

<!doctype html> <html> <head> <meta charset"utf-8"> <title>互动星空</title><style> html,body {margin:0;overflow:hidden;width:100%;height:100%;cursor:none;background:black;background:linear-gradient(to bot…

python 使用 MQTT

目录结构 1、py代码 offRelay12-yixing.py # _*_ coding: utf-8 _*_ # 须用到第三方库&#xff1a;paho-mqtt # 安装命令 python3 -m pip install paho-mqttimport time import json import paho.mqtt.client as mqtt# 函数&#xff1a;关闭所有房间的12路继电器模块上指定的…

Python检查代码质量库之flake8使用详解

概要 Flake8是一个流行的Python库,用于检查代码质量和风格一致性,它集成了PyFlakes、pep8、Ned Batchelder的McCabe script等工具。Flake8可以帮助开发者发现代码中的错误,保持代码风格的一致性,是每个Python开发者工具箱中的重要组成部分。 安装 安装Flake8非常简单,可…

C语言程序设计(三)

1、数据的两种表现形式 常量&#xff1a;其值不能被改变的量称为常量。 变量&#xff1a; 单撇号内只能包含一个字符。双撇号内可以包含一个字符串。 注意&#xff1a;要区分符号常量和变量,不要把符号常量误认为变量。符号常量不占内存只是一个临时符号,代表一个值,在预编译…

AI智能分析赋能EasyCVR视频汇聚平台,为安全生产监管提供保障

一、背景需求 为提升公共及生产安全监管&#xff0c;深入贯彻落实中央关于智慧城市、数字乡村的部署要求&#xff0c;视频设备融合管理已成为视频治理的必然趋势。针对当前部分地区在视频监控系统建设中存在的问题&#xff0c;如重点地区视频监控系统建设零散、视频监控数据孤…

提升滞销商品处理效能,精细化库存管理的关键要素

一、明确滞销商品的概念 1. 什么是滞销商品 滞销商品是指在一定期限内&#xff0c;其销售量大大低于预期或市场需求的商品。具体来说&#xff0c;这些商品可能因为款式不新颖、功能落后、价格不合理、过时、质量不佳或其他因素而不受消费者欢迎&#xff0c;导致销售速度极慢或…

HTTP免费升级到HTTPS攻略

HTTPS就是在HTTP的基础上加入了SSL&#xff0c;将一个使用HTTP的网站免费升级到HTTPS的关键就是申请一个免费的SSL证书 具体步骤如下 1 获取免费SSL证书 国内的JoySSL 提供不限量免费的SSL/TLS证书。根据自己的需求选择证书类型&#xff08;登录JoySSL官网&#xff0c;创建账号…

列表处理基础问题的四种方法:从入门到惊艳

目录 一、引言 二、方法一&#xff1a;基础循环遍历 三、方法二&#xff1a;列表推导式 四、方法三&#xff1a;内置函数与高阶函数 五、方法四&#xff1a;惊艳的库与工具 六、案例研究 七、总结 一、引言 在编程的世界中&#xff0c;列表&#xff08;List&#xff09…

3套Matplotlib主题

分享3套Matplotlib主题&#xff0c;让图表更好看 seaborn默认主题 import seaborn as sns import pandas as pd import matplotlib as mpltips pd.read_csv(./sns_data/tips.csv)sns.relplot(datatips,x"消费金额 ($)",y"小费金额 ($)",hue"客人性…

matlab绘制时间序列图,横坐标轴如何标注为月-日

Excel表格中有类似于如下 年月日对应的数据 导入 matlab中&#xff0c;为数值矩阵&#xff1b;了解该表格中的时间跨度为从2021年1月2日至2021年12月31日&#xff0c;中间没有缺失&#xff0c;绘图代码&#xff1a; % clear; timespan1[20210102 20211231]; datenn1datenum(da…

保姆级教学 基于Hexo搭建个人网站(Github)

文章目录 搭建Hexo静态博客介绍一、注册Github账号二、 安装前置软件包三、 绑定github仓库创建SSH私钥添加私钥连接Github仓库 四、安装hexo1. 更改npm镜像源2. 创建一个文件夹 在里面打开终端3. 初始化hexo 五、切换主题1. 安装主题2. 修改默认主题查看修改主题后的网站 六、…

(图论)最短路问题合集(包含C,C++,Java,Python,Go)

不存在负权边&#xff1a; 1.朴素dijkstra算法 原题&#xff1a; 思路&#xff1a;&#xff08;依然是贪心的思想&#xff09; 1.初始化距离&#xff1a;dis[1]0&#xff0c;dis[i]INF&#xff08;正无穷&#xff09; 2.循环n次&#xff1a; 找到当前不在s中的dis最小的点&…

搭建Docker私有镜像仓库

大家好&#xff0c;今天给大家分享一下如何搭建私有镜像仓库&#xff0c;私有镜像仓库可以更好地管理和控制镜像的访问和使用&#xff0c;确保只有授权的人员能够获取和使用特定的镜像&#xff0c;而且方便团队内部共享定制化的镜像&#xff0c;提高开发和部署效率&#xff0c;…

自动驾驶主流芯片及平台架构(三)低算力平台

前面有提到&#xff0c;自动驾驶等级每增加一级&#xff0c;所需要的芯片算力就会呈现十数倍的上升&#xff0c;L2级自动驾驶的算力需求仅要求2-2.5TOPS&#xff0c;但是L3级自动驾驶算力需求就需要20-30TOPS,到L4级需要200TOPS以上&#xff0c;L5级别算力需求则超过2000TOPS。…

购物车操作

添加购物车&#xff1a; 需求分析和接口设计&#xff1a; 接口设计&#xff1a; 请求方式&#xff1a;POST 请求路径&#xff1a;/user/shoppingCart/add请求参数&#xff1a;套餐id、菜品id、口味返回结果&#xff1a;code、data、msg 数据库设计&#xff1a; 这上面出现了…

JAVA IO/NIO 知识点总结

一、常见 IO 模型简介 1. 阻塞IO模型 最传统的一种IO模型&#xff0c;即在读写数据过程中会发生阻塞现象。当用户线程发出IO请求之后&#xff0c;内核会去查看数据是否就绪&#xff0c;如果没有就绪就会等待数据就绪&#xff0c;而用户线程就会处于阻塞状态&#xff0c;用户线…

IOT-9608I-L ADC端口的使用(连续采样ADC值)

目录 概述 1 硬件介绍 1.1 认识硬件 1.2 引脚信号定义 2 软件功能实现 2.1 查看iio:device0下的接口信息 2.2 实现连续采样ADC 2.2.1 功能描述 2.2.2 代码实现 2.2.3 详细代码 3 测试 概述 本文主要讲述IOT-9608I-L ADC端口的使用方便&#xff0c;其内容包括板卡上的…

无人机运营合格证:民用无人机驾驶航空器运营合格证书

无人机运营合格证是指经国家相关部门审核通过并颁发给相应无人驾驶航空器运营机构的一种资质证明。获得该证书的机构具备相关的技术和管理能力&#xff0c;能够安全、合规地运营无人驾驶航空器。 无人机运营合格证的申请流程一般包括报名、培训学习、考试准备、考试报名、考试…