栈————顺序栈和链式栈

目录

顺序栈

1、初始化顺序栈 

2、判栈空

3、进栈

4、出栈

5、读栈顶元素

6、遍历

链式栈

1、初始化链式栈

2、断链式栈是否为空判

3、入栈(插入)

​编辑​编辑

4、出栈(删除)

5、读取栈顶元素

6、输出链式栈中各个节点的值(遍历)


作为一种数据结构,是一种只能在同一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,最先进入的数据被压入栈底,最后进入的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)也就是后进先出(LIFO)或者先进后出(FILO)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

1.什么是栈,我们引用图例来帮助理解:

顺序栈

1、初始化顺序栈 
SqStack *initStack(){
	SqStack *s; 
	s = (SqStack*)malloc(sizeof(SqStack)); //划分内存空间
	if(!s){//判断内存空间的划分是否成功
        printf("空间不足\n");
        return NULL;
    }else{
        s->top = -1;//栈空以-1标记
        return s;  //返回栈
    }
}
2、判栈空
//判栈空
int stackEmpty(SqStack *s){	
	if(s->top==-1){         
		return 1;       
	}else{
		return 0;      
	}
}
3、进栈
//进栈 
int push(SqStack *s,datatype x){//入栈操作,s代表栈,x代表我们入栈的值 
	if(s->top==MAXSIZE-1)
    {
		printf("\nThe squence stack is full!");
		return 0;
	}else{
		s->data[++s->top]=x;//指针先加一,在入栈 
		return 1; 
	}		    
} 
4、出栈
//出栈 
int pop(SqStack *s,datatype *x){//出栈操作,s代表栈,指针x代表输出的值,指针实参为地址
	if(stackEmpty(s))          //栈空,报错 
	{
		printf("\nThe squence stack is empty!");
		return 0;
	}else{
	    *x=s->data[s->top--];//先出栈,指针在减一 
	    return 1;
	}	    
} 
5、读栈顶元素
//读栈顶元素 
int getTop(SqStack *s){
	if(stackEmpty(s))          //栈空,报错 
	{
	    printf("\n栈是空的!");
		exit(1);
	}else{
		return s->data[s->top];
	} 
}
6、遍历
//遍历 
int display(SqStack *s){
    int i;
    printf("当前栈中的元素:\n");
    for(i = s->top; i >= 0; i--)
        printf("%3d", s->data[i]);
    printf("\n");
    return 0;
}

链式栈

链式栈是一种数据存储结构,可以通过单链表的方式来实现。

优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,且除了存放每个栈元素的数据域,还需要额外分配指针空间用来存放指针的指针域。也就是有一个栈顶指针,指向了一个单链表,单链表存数据,栈顶指针取,放数据。

什么是链式栈?

链式栈,其实和单链表很相似,进栈可以理解为单链表的头插法,出栈可以理解为带头结点的单链表输出,只不过它的头结点就是我们的栈顶,栈顶用来输入和输出。

1、初始化链式栈
//初始化链式栈
int initStack() {
    return  NULL;
}
2、断链式栈是否为空判
//判断链式栈是否为空
int isEmpty(LinkStack *top) {
    return (top?0:1); //栈空返回 1
}
3、入栈(插入)
//入栈(插入)
LinkStack *push(LinkStack *top,datatype x){
    LinkStack *p;
	p = (LinkStack*)malloc(sizeof(LinkStack));//分配空间
    p->data = x;      //设置新结点的值
    p->next = top;   //将新元素插入栈中
    top = p;          //将新元素设为栈顶
    return top;
}
4、出栈(删除)
//出栈(删除)
LinkStack *pop(LinkStack *top,datatype *x) {
	LinkStack *q;
    if(!top){printf("栈为空,无法出栈!\n");return NULL;}
    q = top;         //指向被删除的栈顶  
    *x=q->data;      //返回我们出栈的值 
    top = top->next;   //修改栈顶指针
    free(q);         //释放已经出栈的结点
    return top;
}
5、读取栈顶元素
//读取栈顶元素
int getTop(LinkStack *top) {
    if (!top) {
        printf("栈为空,无法读取栈顶元素!\n");
        return 0;
    }
    return top->data;//返回栈顶的值
}
6、输出链式栈中各个节点的值(遍历)
//输出链式栈中各个节点的值
void display(LinkStack *top) {
    LinkStack *p = top;
    if (!p) {printf("栈为空,无法读取栈顶元素!\n");}
    while (p) {
        printf("%3d ", p->data);
        p = p->next;
    }
    printf("\n");
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第2题两数相加

题目: 题解: func addTwoNumbers(l1, l2 *ListNode) (head *ListNode) {var tail *ListNodecarry : 0for l1 ! nil || l2 ! nil {n1, n2 : 0, 0if l1 ! nil {n1 l1.Vall1 l1.Next}if l2 ! nil {n2 l2.Vall2 l2.Next}sum : n1 n2 carrysum, carry …

(React组件基础)前端八股文Day6

一 类组件与函数组件有什么异同 在React中,类组件和函数组件是创建组件的两种主要方式。随着React的发展,尤其是自Hooks在React 16.8中引入以来,函数组件的功能变得更加强大,使得它们能够更加方便地与类组件相竞争。下面是类组件…

MySQL数据库(高级)

文章目录 1.MySQL约束1.主键细节说明演示复合主键 2.not null(非空)3.unique(唯一)细节说明演示 4.外键外键示意图使用细节演示 5.check演示 6.创建表练习答案 7.自增长演示细节 2.索引1.索引机制2.创建索引演示细节 3.删除索引4.…

【苹果MAC】苹果电脑 LOGI罗技鼠标设置左右切换全屏页面快捷键

首先键盘设置->键盘快捷键 调度中心 设置 f1 f2 为移动一个空间(就可以快捷移动了) 想要鼠标直接控制,就需要下载官方驱动,来设置按键快捷键,触发 F1 F2 安装 LOGI OPTIONS Logi Options 是一款功能强大且便于使用…

Yarn的安装和使用(2):使用及问题解决

Yarn是JavaScript的依赖管理工具,它与npm类似,但提供了一些额外的性能优化和一致性保证。 Yarn的使用: 初始化项目: yarn init 此命令会引导您创建一个新的package.json文件,用于记录项目的元信息和依赖。 添加依赖&…

38.HarmonyOS鸿蒙系统 App(ArkUI)堆叠布局结合弹性布局

层叠布局用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠,容器中的子元素(子组件)依次入栈,后一个子元素覆盖前一个子元素,子元素…

神经网络与深度学习(一)误差反传BP算法

误差反传BP算法 1多层感知机1.1XOR问题1.2多层感知机 2.BP算法2.1简述2.2详解2.2.1输入输出模型2.2.2梯度下降算法迭代2.2.3前向传播在输出端计算误差2.2.4误差反传--输出层2.2.5误差反传--隐含层2.2.6误差反传--总结 1多层感知机 1.1XOR问题 线性不可分问题: 无法…

正弦实时数据库(SinRTDB)的使用(10)-数据文件的无损压缩

前文已经将正弦实时数据库的使用进行了介绍,需要了解的可以先看下面的博客: 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

LabVIEW双通道太阳射电频谱观测系统

LabVIEW双通道太阳射电频谱观测系统 开发了一个基于LabVIEW平台开发的双通道高速太阳射电频谱观测系统。该系统实时监测太阳射电爆发,具有随机性、持续时间短、变化快等特点。通过高速信号采集卡实现1.5 GS/s的信号采集,时间分辨率可达4ms,频…

jvm类加载机制概述

、什么是jvm的类加载机制 类加载机制是指我们将类的字节码文件所包含的数据读入内存,同时我们会生成数据的访问入口的一种 特殊机制。那么我们可以得知,类加载的最终产品是数据访问入口。 加载类文件(即.class文件)的方式有以下几…

ChatGPT chrome扩展下载与安装

官方下载地址 https://chromewebstore.google.com/detail/lpbhmlbicmgjpacbofijdfpcplfhakeo 截图 安装 离线安装 下载地址 https://static.xutongbao.top/app/chatgpt-chrome-crx-v0.0.7.zip 打开链接 chrome://extensions/ 人工智能学习网站 https://chat.xutongbao.to…

获取电商数据的几种方法分享

在数字化时代,电商数据已经成为企业决策的重要依据。无论是市场趋势的洞察、用户行为的分析,还是产品优化和营销策略的制定,都离不开电商数据的支持。本文将分享几种获取电商数据的有效方法,力求在干货满满的同时,也不…

精通【PHP循环结构知识】

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

怎么打包出release.aar包

第一种 选择build variant 更改成release 第二钟 在gradle中选择相应任务来编译 选择assemble release如果没有这个选项,可能是你没有开启那个Task 收集的选项

Acrobat Pro DC 2023 for Mac PDF编辑管理软件

Acrobat Pro DC 2023 for Mac是一款功能强大的PDF编辑和管理软件,旨在帮助用户轻松处理PDF文件。它提供了丰富的工具和功能,使用户可以创建、编辑、转换和注释PDF文件,以及填写和签署PDF表单。 软件下载:Acrobat Pro DC 2023 for …

2024年泰迪杯数据挖掘B题详细思路代码文章教程

目前b题已全部更新包含详细的代码模型和文章,本文也给出了结果展示和使用模型说明。 同时文章最下方包含详细的视频教学获取方式,手把手保姆级,模型高精度,结果有保障! 分析: 本题待解决问题 目标&#…

QT-左框选项卡软件界面框架

QT-左框选项卡软件界面框架 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include <QTextBrowser> #include <QLabel> #include <QPushButton> #include <QSpacerItem> #include <QToolButton> #include <QDebug> #i…

Ribbon有哪些负载均衡策略

负载均衡类都实现了IRule接口。 RandomRule&#xff1a;随机的选用一个实例 RoundRobinRule&#xff1a;轮询的使用实例 RetryRule&#xff1a;在轮询的基础上加了一个错误重试机制&#xff0c;在deadline时间内会不断的重试 WeightResponeTimeRule&#xff1a;根据权重去做…

WebGIS 之 vue3+vite+ceisum

1.项目搭建node版本在16以上 1.1创建项目 npm create vite 项目名 1.2选择框架 vuejavaScript 1.3进入项目安装依赖 cd 项目名 npm install 1.4安装cesium依赖 pnpm i cesium vite-plugin-cesium 1.5修改vite.config.js文件 import { defineConfig } from vite import vue fr…

【Docker笔记05】【网络模式】

一、前言 本系列是根据 B 站 尚硅谷 Docker 视频 学习记录笔记。因为没有视频课件&#xff0c;部分内容摘自 https://www.yuque.com/tmfl/cloud/dketq0。 本系列仅为自身学习笔记记录使用&#xff0c;记录存在偏差&#xff0c;推荐阅读原视频内容或本文参考笔记。 二、简单介…