数据结构----栈

一丶概念

          只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底

二丶特点

        先进后出 FILO first in last out
        后进先出 LIFO last in first out

三丶顺序栈

     逻辑结构:线性结构
     存储结构:顺序存储
     操作:入栈、出栈

1.创建一个空的栈

2.入栈

3.出栈

       
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct seqstack
{int maxlen;     // 数组中元素总个数datatype *data; // 指向数组的指针int top;        // 栈顶元素的下表
} seqstack_t;
seqstack_t *CreateEplist(int len)//创建一个空表
{seqstack_t *p = (seqstack_t *)malloc(sizeof(seqstack_t));//先对结构体指针开辟堆区空间if (NULL == p)//判错{printf("Create err");return NULL;}p->maxlen = len;p->top = -1;//初始化结构体p->data = (int *)malloc(sizeof(int) * len);//对指向数组的指针开辟堆区空间if (NULL == p->data)//判错{printf("DATA err");return NULL;}return p;
}
int Isfull(seqstack_t *p)//判断结构体是否为满
{return p->top + 1 == p->maxlen;
}
int IsEmpty(seqstack_t *p)//判断结构体是否为空
{return p->top == -1;
}
int Pushdata(seqstack_t *p, int data)//输入数据,入栈
{if (Isfull(p)){printf("Seqstack is full");return -1;}p->top++;p->data[p->top] = data;return 0;
}
int show(seqstack_t *p)//输出数据,出栈
{if (IsEmpty(p)){printf("Seqstack is empty");return -1;}while (!IsEmpty(p)){p->top--;printf("%d ",p->data[p->top + 1]);}printf("\n");
}
void Clearlist(seqstack_t *p)//清空栈
{p->top = -1;
}
int main(int argc, char const *argv[])
{seqstack_t *p = CreateEplist(10);Pushdata(p, 1);Pushdata(p, 2);Pushdata(p, 3);Pushdata(p, 4);Pushdata(p, 5);show(p);printf("%d\n", p->top);printf("%d\n", p->maxlen);return 0;
}

练习:
 

1. 若进栈顺序为 1,2,3,4 一下四种情况不可能出现的出栈序列是( )

      A. 1,4,3,2                B. 2,3,4,1               C. 3,1,4,2              D. 3,4,2,1

2. 下列叙述正确的是( )

     A. 线性表是线性结构
     B. 栈与队列是非线性结构 //栈只能在一端进行插入和删除操作的线性表
     C. 线性链表是非线性结构

     D. 二叉树是线性结构 //树形结构 层次关系

3. 下列关于栈叙述正确的是( )

      A.在栈中只能插入数据//栈只能在一端进行插入和删除操作的线性表,插入和删除端称为栈顶 ,另一端是栈底
      B.在栈中只能删除数据
      C.栈是先进先出的线性表
      D.栈是先进后出的线性表

四丶链式栈

        逻辑结构:线性结构

        存储结构:链式存储
        操作:入栈、出栈

#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct linkstack
{datatype data;          // 数据域struct linkstack *next; // 指针域
} linkstack_t;
// 1.创建一个空的栈
void CreateEpLinkStack(linkstack_t **ptop)
{*ptop = NULL; // 主函数中top = NULL;
}
// 2.入栈   data是入栈的数据
//  参数上之所以采用二级指针,因为我们要随着入栈添加新的节点作为头,top需要永远指向当前链表的头,
//  那么修改main函数中的top,我们采用地址传递
int PushLinkStack(linkstack_t **ptop, datatype data)
{// 1.创建一个新节点,并初始化linkstack_t *pnew = (linkstack_t *)malloc(sizeof(linkstack_t));if (pnew == NULL){perror("PushLinkStack err");return -1;}pnew->data = data;pnew->next = NULL;// 2.将新节点头插到无头单向链表中pnew->next = *ptop;// 3.移动栈针,栈针top永远只向无头单向链表的第一个节点*ptop = pnew;return 0;
}
// 3.判断栈是否为空
int IsEpLinkStack(linkstack_t *top)
{return top == NULL;
}
// 4.出栈
datatype PopLinkStack(linkstack_t **ptop)
{// 1.容错判断if (IsEpLinkStack(*ptop)){perror("IsEpLinkStack");return -1;}// 2.定义pdel指向被删除节点linkstack_t *pdel = *ptop;// 3.定义一个变量temp保存出栈数据datatype temp = pdel->data;// 4.移动栈针(跨过被删除节点)*ptop = (*ptop)->next;// 5.释放被删除节点free(pdel);pdel = NULL;return temp;
}
// 5.清空栈
void ClearLinkStack(linkstack_t **ptop) // 用二级指针,是因为清空后需要将main函数中的top变为NULL
{while (!IsEpLinkStack(*ptop))PopLinkStack(ptop);
}
// 6.求栈的长度
int LengthLinkStack(linkstack_t *top) // 用一级指针,是因为我只是求长度,不需要修改main函数中top指针的指向
{int len = 0;// top相当于无头单向链表的头指针,求长度,遍历无头单向链表while (top != NULL){len++;top = top->next;}return len;
}
// 7.获取栈顶数据,不是出栈,不需要移动main函数中的top,所以用一级指针
datatype GetTopLinkStack(linkstack_t *top)
{if (!IsEpLinkStack(top))return top->data;return -1;
}int main(int argc, char const *argv[])
{linkstack_t *top; //CreateEpLinkStack(&top);for (int i = 1; i <= 5; i++)PushLinkStack(&top, i);printf("top value is %d\n", GetTopLinkStack(top));printf("len is %d\n", LengthLinkStack(top));while (!IsEpLinkStack(top)){printf("%d ", PopLinkStack(&top));}printf("\n");return 0;
}

总结:

顺序栈和链式栈的区别是什么?

     (1)存储结构不同,顺序栈相当于数组,连续的,链式栈 链表非连续的
     (2)顺序栈的长度受限制,而链栈不会

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

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

相关文章

【网络】套接字(socket)编程——TCP版

接着上一篇文章&#xff1a;http://t.csdnimg.cn/GZDlI 在上一篇文章中&#xff0c;我们实现的是UDP协议的&#xff0c;今天我们就要来实现一下TCP版本的 接下来接下来实现一批基于 TCP 协议的网络程序&#xff0c;本节只介绍基于IPv4的socket网络编程 基于 TCP 的网络编程开…

python从入门到精通:函数

目录 1、函数介绍 2、函数的定义 3、函数的传入参数 4、函数的返回值 5、函数说明文档 6、函数的嵌套调用 7、变量的作用域 1、函数介绍 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能的代码段。 name "zhangsan"; length len(nam…

Java八股整合(MySQL+Redis+Maven)

MySQL 数据库设计三范式 不可再分&#xff0c;部分依赖&#xff0c;传递依赖 主键和外键区别 主键非空约束&#xff0c;唯一性约束&#xff0c;唯一标识一个字段 外键用于和其他表建立连接&#xff0c;是另一张表的主键&#xff0c;可重复可为空可以有多个 为什么不推荐使…

链表---数据结构-黑马

链表 定义 链表是数据元素的线性集合&#xff0c;其每个元素都指向下一个元素&#xff0c;元素存储上是不连续的。 分类 单向链表&#xff0c;每个元素只知道自己的下一个元素是谁。 双向链表&#xff0c;每个元素知道自己的上一个元素和下一个元素。 循环链表&#xff0c;…

【深度学习】单层神经网络

单层神经网络 神经元感知机 1943年&#xff0c;心理学家McCulloch和数学家Pitts共同发表了神经网络的开山之作A Logical Calculus of the Ideas Immanent in Nervours Activity1&#xff0c;提出了神经网络的第一个数学模型——MP模型。该模型也成为了人工神经网络的基础。 神经…

代码随想录算法训练营第十四天| 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度

目录 一、LeetCode 226.翻转二叉树思路&#xff1a;C代码 二、LeetCode 101. 对称二叉树思路C代码 二、LeetCode 104.二叉树的最大深度思路C代码 二、LeetCode 111.二叉树的最小深度思路C代码 总结 一、LeetCode 226.翻转二叉树 题目链接&#xff1a;LeetCode 226.翻转二叉树 …

springboot静态资源访问问题归纳

以下内容基于springboot 2.3.4.RELEASE 1、默认配置的springboot项目&#xff0c;有四个静态资源文件夹&#xff0c;它们是有优先级的&#xff0c;如下&#xff1a; "classpath:/META-INF/resources/", &#xff08;优先级最高&#xff09; "classpath:/reso…

Unified 阻抗控制 architecture、framework、approach

Unified 阻抗控制&#xff08;Unified Impedance Control&#xff09;作为一种控制策略&#xff0c;其architecture&#xff08;架构&#xff09;、framework&#xff08;框架&#xff09;和approach&#xff08;方法&#xff09;为&#xff1a; 一、Unified 阻抗控制 Archite…

骨板和螺钉市场分析:前五大厂商占有大约78.0%的市场份额

据QYResearch调研团队最新报告“全球骨板和螺钉市场报告2024-2030”显示&#xff0c;预计2030年全球骨板和螺钉市场规模将达到76.2亿美元&#xff0c;未来几年年复合增长率CAGR为3.7%。 根据QYResearch头部企业研究中心调研&#xff0c;全球范围内骨板和螺钉生产商主要包括J &a…

视频美颜SDK与直播美颜工具的开发详解与技术优化

本篇文章&#xff0c;小编将为开发者提供一份详细的美颜指南。 一、视频美颜SDK的核心功能 视频美颜SDK是一种嵌入式软件开发工具包&#xff0c;允许开发者在应用中轻松实现实时美颜效果。其核心功能主要包括&#xff1a; 1.实时磨皮 2.美白功能 3.瘦脸与大眼 4.智能滤镜…

AWS 消息队列服务 SQS

AWS 消息队列服务 SQS 引言什么是 SQSSQS 访问策略 Access Policy示例&#xff1a;如何为 DataLake Subscription 配置 SQS 引言 应用系统需要处理海量数据&#xff0c;数据发送方和数据消费方是通过什么方式来无缝集成消费数据的&#xff0c;AWS 提供 SQS 消息队列服务来解决…

设计模式21-组合模式

设计模式21-组合模式&#xff08;Composite Pattern&#xff09; 写在前面 动机定义与结构定义结构主要类及其关系 C代码推导优缺点应用场景总结补充叶子节点不重载这三个方法叶子节点重载这三个方法结论 写在前面 数据结构模式 常常有一些组件在内部具有特定的数据结构。如何…

牛客网SQL进阶135 :每个6/7级用户活跃情况

每个67级用户活跃情况_牛客题霸_牛客网 0 问题描述 基于用户信息表user_info、、试卷作答记录表exam_record、题目练习记录表practice_record&#xff0c;统计 每个6/7级用户总活跃月份数、2021年活跃天数、2021年试卷作答活跃天数、2021年答题活跃天数&#xff0c;结果 按照总…

在linux上架设Web服务器Apache(Ubuntu)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力! 江山如画&#xff0c;客心如若&#xff0c;欢迎到访&#xff0c;一展风采 文章目录 背景1. 安装 Apache2. 启动和检查 Apache 服务…

强烈推荐这三款IOS应用,让你的生活更美好

Dino记账 Dino记账是一款结合了简洁设计和强大功能的记账应用&#xff0c;它通过多维度图表帮助用户轻松掌握金钱流向。应用界面明亮且配色突出&#xff0c;使得记录内容易于阅读&#xff0c;让记账和管理账目变得更加简单。 主要特性&#xff1a; 极简风格与易用性&#xff1…

掌握 Spring Boot + MyBatis-Plus 动态数据源切换,只要5分钟!

数据量猛增&#xff0c;通过动态数据源切换&#xff0c;我们不仅能提高查询效率&#xff0c;还能保证系统的高可用性。 通过将写操作集中在主库&#xff0c;读操作分散到多个从库&#xff0c;可以有效减轻数据库的压力。 在pom.xml中添加以下依赖&#xff1a; xml <depend…

Qt系统机制

Qt系统 Qt文件概述输入输出设备类QFileQFileInfoQt多线程Qt多线程常用API使用Qt多线程 线程安全互斥锁读写锁条件变量信号量 Qt网络QUdpSocketQNetworkDatagram设计一个UDP回显服务器QTcpServerQTcpSocketTcp版本的回显服务器HttpClient核心API Qt 音频Qt视频 Qt文件概述 ⽂件操…

入门Pandas必练习100题基础到进阶|阶级教程2

作者:郭震 51. How to get the row number of the nth largest value in a column? Find the row position of the 5th largest value of column a in df. # input df pd.DataFrame(np.random.randint(1, 30, 30).reshape(10,-1), columnslist(abc)) df# Solution 1# argsort…

HEML+CSS超详细基础知识

一些快捷键 ctrl/ 是注释 ctrld 是选中多个相同字 ctrls保存 altZ自动换行 altshift选中多行 HTML认知 基础认知 html初尝试 HTML页面结构介绍 初次尝试 开始动手写一个网页 先新建一个文件&#xff0c;记得后缀要命名成html 然后shift&#xff01;&#xff0c;就会自动…