数据结构之线性表(4)

前面我们了解到线性表中的顺序表、链表等结构,今天我们探讨新的一种线性表——
那么我们开始栈的探讨之旅吧。

1.栈的基本概念

1.1栈(Stack):

是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。
栈顶(Top):线性表允许进行插入删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素的空表。
在这里插入图片描述

1.2栈的特点:

因为栈只能在栈顶进行操作,所以栈的特点是先进后出(FILO)

2.栈的实现

对栈的实现,有多种实现的方法
1.顺序栈

  • 静态顺序栈
#define MAX_SIZE 100
typedef struct StackNods
{datatype data[MAX_SIZE];size_t top;size_t capacity;
}ST;

缺点:存储空间有限,多了浪费空间,少了不够用

  • 动态顺序栈
typedef struct StackNods
{datatype *array;size_t top;size_t capacity;
}ST;

2.链栈

typedef struct StackNods
{datatype data;struct StackNods* next;
}ST;

缺点:需要浪费空间存储下一个结点的指针(地址)

综合三种结构,我们采用顺序中的动态栈来完成栈的相关操作:

2.1 栈的初始化

在对栈的初始化之前,有两种情况
top初始化为0的情况
在这里插入图片描述

top初始化为-1的情况
在这里插入图片描述
我们从top初始化为0探讨栈的相关操作

//栈的初始化
void Stackinit(ST *pt)
{assert(pt);pt->array = (datatype*)malloc(sizeof(datatype) * 4);if (pt->array == NULL){printf("malloc fail\n");exit(-1);}pt->capacity = 4;pt->top = 0;
}

2.2压栈

//压栈
void StackPush(ST* pt,datatype x)
{assert(pt);ST* tmp=NULL;if (pt->top == pt->capacity)//表示栈满了 -》扩容{tmp = (datatype*)realloc(pt->array, pt->capacity * sizeof(datatype) * 2);if (tmp == NULL){printf("realloc fail\n");exit(-1);}else{pt->array = tmp;pt->capacity*=2;//容量变成两倍}}pt->array[pt->top] = x;pt->top++;
}

2.3出栈

void StackPop(ST* pt)
{assert(pt);//栈空了,调用top,直接种植程序报错assert(pt->top > 0);pt->top--;
}

2.4取栈顶元素

//取栈顶元素
datatype StackTop(ST* pt)
{assert(pt);assert(pt->top > 0);return pt->array[pt->top - 1];
}

2.5求栈内元素个数

//求栈内元素个数
int StackSize(ST* pt)
{assert(pt);return pt->top;
}

2.6判栈空

//判栈空
bool StackEmpty(ST* pt)//用布尔类型判断
{assert(pt);return pt->top == 0;
}

2.7栈打印

//打印
void StackPrintf(ST pt)//打印时不需要对站内元素进行修改,所以不需要传指针
{while (pt.top){printf("%d ", pt.array[pt.top - 1]);StackPop(&pt);}		
}

2.8栈销毁

//栈销毁
void StackDestory(ST* pt)
{assert(pt);free(pt->array);pt->array = NULL;pt->capacity = pt->top = 0;
}

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int datatype;
typedef struct StackNods
{datatype * array;size_t top;size_t capacity;
}ST;//栈的初始化
void Stackinit(ST *pt)
{assert(pt);pt->array = (datatype*)malloc(sizeof(datatype) * 4);if (pt->array == NULL){printf("malloc fail\n");exit(-1);}pt->capacity = 4;pt->top = 0;
}
//压栈
void StackPush(ST* pt,datatype x)
{assert(pt);ST* tmp=NULL;if (pt->top == pt->capacity)//表示栈满了 -》扩容{tmp = (datatype*)realloc(pt->array, pt->capacity * sizeof(datatype) * 2);if (tmp == NULL){printf("realloc fail\n");exit(-1);}else{pt->array = tmp;pt->capacity*=2;//容量变成两倍}}pt->array[pt->top] = x;pt->top++;
}
//出栈
void StackPop(ST* pt)
{assert(pt);//栈空了,调用Top,直接种植程序报错assert(pt->top > 0);pt->top--;
}
//取栈顶元素
datatype StackTop(ST* pt)
{assert(pt);assert(pt->top > 0);return pt->array[pt->top - 1];
}
//求栈内元素个数
int StackSize(ST* pt)
{assert(pt);return pt->top;
}
//判栈空
bool StackEmpty(ST* pt)
{assert(pt);return pt->top == 0;
}
//
void StackPrintf(ST pt)
{while (pt.top){printf("%d ", pt.array[pt.top - 1]);StackPop(&pt);}	printf("\n");
}
//栈销毁
void StackDestory(ST* pt)
{assert(pt);free(pt->array);pt->array = NULL;pt->capacity = pt->top = 0;
}
int main()
{ST pt;Stackinit(&pt);StackPush(&pt, 1);StackPush(&pt, 1);StackPush(&pt, 2);StackPush(&pt, 3);StackPush(&pt, 4);StackPrintf(pt);printf("栈内元素个数有%d 个",StackSize(&pt));StackDestory(&pt);return 0;
}

以上就是栈的一些基本操作啦,谢谢大家支持!

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

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

相关文章

对象和引用类型的赋值都是通过引用传递的方式进行的,这意味着变量实际上存储的是对象的引用,而不是对象本身的副本

这篇博客我主要想解释一下这句话&#xff1a;对象和引用类型的赋值都是通过引用传递的方式进行的&#xff0c;这意味着变量实际上存储的是对象的引用&#xff0c;而不是对象本身的副本。 其实这段话早在学习JS的时候就接触过&#xff0c;只是被我丢进了“记忆垃圾桶”&#xf…

[大模型]Llama-3-8B-Instruct FastApi 部署调用

环境准备 在 Autodl 平台中租赁一个 3090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch-->2.1.0-->3.10(ubuntu22.04)-->12.1。 接下来打开刚刚租用服务器的 JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载和运行演示。 pip 换源…

C语言杂谈:结构体内存对齐

#include<stdio.h> struct S1 {char c1;int i;char c2; }; struct S2 {char c1;char c2;int i; }; int main() {printf("%d\n", sizeof(struct S1));printf("%d\n", sizeof(struct S2));return 0; } 看上面的代码&#xff0c;我们想想应该会输出什么…

【MySQL】E-R图-关系数据模型-3NF--精讲+练习(巨全面)

一.知识储备 E-R图 E-R图&#xff0c;即实体-关系图&#xff08;Entity-Relationship Diagram&#xff09;&#xff0c;是数据库建模的一种工具&#xff0c;用于表示实体类型、属性以及它们之间的关系。 在E-R图中&#xff0c;实体用矩形表示&#xff0c;属性用椭圆表示&…

【最新鸿蒙应用开发】——关于鸿蒙MVVM模式的理解

MVVM模式 MVVM&#xff08;Model-View-ViewModel&#xff09;是一种软件设计模式&#xff0c;主要用于分离应用程序的用户界面&#xff08;UI&#xff09;和业务逻辑。这种模式可以帮助开发者更高效地开发和管理复杂的用户界面。 程序的状态数据通常包含了数组、对象&#xff0…

Python 植物大战僵尸游戏【含Python源码 MX_012期】

简介&#xff1a; "植物大战僵尸"&#xff08;Plants vs. Zombies&#xff09;是一款由PopCap Games开发的流行塔防游戏&#xff0c;最初于2009年发布。游戏的概念是在僵尸入侵的情境下&#xff0c;玩家通过种植不同种类的植物来保护他们的房屋免受僵尸的侵袭。在游…

c语言回顾-函数递归

1.递归的介绍 1.1什么是递归 递归是指在一个函数的定义中调用自身的过程。简单来说&#xff0c;递归是一种通过重复调用自身来解决问题的方法。 递归包括两个关键要素&#xff1a;基本情况和递归情况。基本情况是指当问题达到某个特定条件时&#xff0c;不再需要递归调用&am…

Postman简介

目录 1.概述 2.诞生背景 3.历史版本 4.安装和卸载 5.菜单和菜单项 6.使用 7.应用场景 8.示例 8.1.简单的GET请求 8.2.POST请求提交数据 8.3.查询参数 9.未来展望 10.总结 1.概述 Postman是一款用于API开发、测试和文档管理的综合性工具。允许开发者和测试人员创建…

【深度学习】数竹签演示软件系统

往期文章列表&#xff1a; 【YOLO深度学习系列】图像分类、物体检测、实例分割、物体追踪、姿态估计、定向边框检测演示系统【含源码】 【深度学习】物体检测/实例分割/物体追踪/姿态估计/定向边框/图像分类检测演示系统【含源码】 【深度学习】YOLOV8数据标注及模型训练方法整…

使用Redis将单机登录改为分布式登录

使用Redis将单机登录改为分布式登录 1. 背景 ​ 现在大多数的应用程序登录的方式都是必须满足分布式登录的效果&#xff0c;比如我们在一个客户端登录之后可以在另一个客户端上面共享当前用户的信息&#xff0c;这样在另一个客户端登录的时候就不用用户再次输入自己的账号密码…

Java 面向对象 -- Java 语言的封装、继承、多态、内部类和 Object 类

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 007 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

R语言数据分析案例27-使用随机森林模型对家庭资产的回归预测分析

一、研究背景及其意义 家庭资产分析在现代经济学中的重要性不仅限于单个家庭的财务健康状况&#xff0c;它还与整个经济体的发展紧密相关。家庭资产的增长通常反映了国家经济的整体增长&#xff0c;而资产分布的不均则暴露了经济不平等的问题。因此&#xff0c;全球视角下的家…

实时交通 | 城市交通态势采集及可视化操作(定时运行)

一、前言 交通态势数据是关于交通状况的一种量化描述&#xff0c;它提供了关于道路网络运行状态的详细信息。交通态势数据指的是根据车流入量和车流出量的定义&#xff0c;衡量整个全局交通区域交通态势的数据。这些数据通常从车辆GPS轨迹数据中提取&#xff0c;包括车辆行驶速…

Folx软件下载及安装教程

简介&#xff1a; Folx Pro是一款适合Mac的专业下载工具也是一款BT下载器&#xff0c;Folx中文版有一个支持Retina显示的现代界面&#xff0c;提供独特的系统排序、存储下载内容与预览下载文件。Folx中文官网提供Folx教程、激活码、下载。 安 装 包 获 取 地 址&#xff1a; …

tcp协议机制的总结(可靠性,提高性能),基于tcp的应用层协议,用udp如何实现可靠传输

目录 总结 引入 可靠性 ​编辑 分析 三次握手 提高性能 其他 常见的基于tcp应用层协议 用udp实现可靠传输 总结 引入 为什么tcp要比udp复杂的多? 因为它既要保证可靠性,又要兼顾性能 可靠性 分析 其中,序列号不止用来排序,还可以用在重传时去重 确认应答是机制中的…

34 Debian如何配置ELK群集

作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何配置ELK群集 《傅老师Debian知识库系列之34》——原创 ==前言== 傅老师Debian知识库特点: 1、拆解Debian实用技能; 2、所有操作在VMware虚拟机实测完成; 3、致力于最终形成Debian知识手…

开放式耳机值得入手买吗?可以对比这几款开放式耳机看看

居家办公时&#xff0c;选择一款合适的耳机能够有效地提高工作效率。入耳式耳机虽然能够有效地隔绝外界噪音&#xff0c;但长时间佩戴会对耳朵造成负担&#xff0c;甚至引发耳道感染。而头戴式耳机虽然能够提供更好的音质&#xff0c;但体积较大&#xff0c;佩戴起来不够灵活。…

仿FC数学金刚游戏介绍

简介 Math Monkey是Simple2l工作室开发的第二款小游戏&#xff0c;灵感来源于FC游戏平台的数学金刚游戏。小学时玩FC游戏是业余时间最期待的事情&#xff0c;还记得有一次和玩伴玩游戏时已经晚上了&#xff0c;于是约定再玩一把就各回各家&#xff0c;没想到又连玩了N把每一把…

大模型日报|今日必读的 8 篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.Google DeepMind 新研究&#xff1a;当 Transformer 遇见神经算法推理器 Transformer 以其简单而有效的架构彻底改变了机器学习。在互联网的海量文本数据集上预先训练 Transformer&#xff0c;为自然语言理解&…