24考研数据结构-栈

目录

  • 第三章 栈和队列
    • 3.1栈(stack)
      • 3.1.1栈的基本概念
        • 栈的基本概念知识回顾
      • 3.1.2 栈的顺序存储
        • 上溢与下溢
        • 栈的顺序存储知识回顾
      • 3.1.3栈的链式存储
        • 链栈的基本操作

第三章 栈和队列

3.1栈(stack)

3.1.1栈的基本概念

  1. 栈的定义
  • 栈是特殊的线性表:只允许在一端进行插入或删除操作, 其逻辑结构与普通线性表相同
  • 栈顶(Top):允许进行插入和删除的一端 (最上面的为栈顶元素);
  • 栈底(Bottom):固定的,不允许进行插入和删除的一端 (最下面的为栈底元素);
  • 空栈:不含任何元素的空表;

特点:LIFO 后进先出(后进栈的元素先出栈)可以实现特定的逻辑
栈的增删改查操做的存取数据的时间复杂度均为O(1)

缺点:栈的大小不可变,解决方法——共享栈;
栈的数学性质: 卡特兰数
n个不同元素进栈,有 1 n + 1 C 2 n n \frac{1}{n+1}C^{n}_{2n} n+11C2nn种不同的出栈书顺序

  1. 栈的基本操作

“创建&销毁”

  • InitStack(&S) 初始化栈:构造一个空栈S,分配内存空间;
  • DestroyStack(&S) 销毁栈:销毁并释放栈S所占用的内存空间;

“增&删”

  • Push(&S, x) 进栈:若栈S未满,则将x加入使其成为新栈顶;
  • Pop(&S, &x) 出栈:若栈S非空,则弹出(删除)栈顶元素,并用x返回;

“查顶&判空”

  • GetTop(S, &x) 读取栈顶元素:若栈S非空,则用x-返回栈顶元素;(栈的使用场景大多只访问栈顶元素);
  • StackEmpty(S) 判空: 断一个栈S是否为空,若S为空,则返回true,否则返回false;

栈的基本概念知识回顾

在这里插入图片描述

3.1.2 栈的顺序存储

  1. 顺序栈的定义
#define MaxSize 10         //定义栈中元素的最大个数typedef struct{ElemType data[MaxSize];       //静态数组存放栈中元素int top;                      //栈顶元素
}SqStack;void testStack(){SqStack S;       //声明一个顺序栈(分配空间)//连续的存储空间大小为 MaxSize*sizeof(ElemType)
}注意此处的    int top;    //栈顶元素表示存储的是数组下标
其实用int * top用一个指针来实现逻辑也行
  1. 顺序栈的基本操作
#define MaxSize 10         //定义栈中元素的最大个数typedef struct{ElemType data[MaxSize];       //静态数组存放栈中元素int top;                      //栈顶元素
}SqStack;分配的空间为 Maxsize*sizeof(ElemType),
但是是程序运行时系统分配的不是自己主动malloc的
所以不需要在最后free,所以只需要逻辑上回收将指针移动就行//初始化栈
void InitStack(SqStack &S){S.top = -1;                   //初始化栈顶指针
}//判栈空
bool StackEmpty(SqStack S){if(S.top == -1)      //栈空return true;else                 //栈不空return false;
}//新元素进栈
bool Push(SqStack &S, ElemType x){if(S.top == MaxSize - 1)        //栈满return false;S.top = S.top + 1;    //指针先加1S.data[S.top] = x;    //新元素入栈/*S.data[++S.top] = x;*/return true;
}//出栈
bool Pop(SqStack &x, ElemType &x){if(S.top == -1)          //栈空return false;x = S.data[S.top];       //先出栈S.top = S.top - 1;       //栈顶指针减1return true;/*x = S.data[S.top--];*/只是逻辑上的删除,数据依然残留在内存里但是这个程序执行结束,对应的内存系统会自行回收}//读栈顶元素
bool GetTop(SqStack S, ElemType &x){if(S.top == -1)return false;x = S.data[S.top];      //x记录栈顶元素return true; 
}void testStack(){SqStack S;       //声明一个顺序栈(分配空间)InitStack(S);//...
}

另一种设置栈顶指针位置的方法:初始化时定义 S.top = 0 ;top指针指向下一个可以插入元素的位置,也就是栈顶元素的后一个位置。
(总的来说,之前那种方法是top指针指向已经有元素的位置并且top == -1为判空条件,这种方法是指向没有元素的位置并且top == 0为判空条件)

初始化时定义 S.top = 0:

  • 进栈操作 :栈不满时,栈顶指针先加1,再送值到栈顶元素。S.data[S.top++] = x;
  • 出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针减1。`x = S.data[–S.top];
  • 栈空条件:S.top==-1
  • 栈满条件:S.top==MaxSize-1
  • 栈长:S.top+1

3.共享栈
定义:利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸

在这里插入图片描述


#define MaxSize 10         //定义栈中元素的最大个数typedef struct{ElemType data[MaxSize];       //静态数组存放栈中元素int top0;                     //0号栈栈顶指针int top1;                     //1号栈栈顶指针
}ShStack;//初始化栈
void InitSqStack(ShStack &S){S.top0 = -1;        //初始化栈顶指针S.top1 = MaxSize;   
}共享栈 栈满条件:S.top0 + 1 = S.top

在这里插入图片描述


上溢与下溢

参考博客: 上溢与下溢

上溢与下溢分为堆栈的上溢与下溢缓冲区的上溢和下溢

  1. 堆栈的上溢与下溢

堆栈区域是在堆栈定义时就确定了的,因而堆栈工作过程中有可能产生溢出。堆栈溢出有两种情况可能发生:如堆栈已满,但还想再存入信息,这种情况称为堆栈上溢;另一种情况是,如堆栈已空,但还想再取出信息,这种情况称为堆栈下溢。


采取保护措施:这可以通过给SP规定上、下限,在进栈或出栈操作前先做SP和边界值的比较,如溢出则作溢出处理,以避免破坏其他存储区或使程序出错的情况发生。

共享栈只有在整个对堆栈空间被占满才发生上溢,因为栈是只在头部进行操作的一种抽象数据结构,所以只可能发生上溢

  1. 缓冲区的上溢和下溢

上溢就是缓冲器满,还往里写;下溢就是缓冲器空,还往外读.
软件对硬件处理的不合理,速度的不一导致的上溢与下溢


如果指数据发送太快,硬件处理不过来,缓存已经装不下那么多数据,开始丢弃这些数据,放弃处理.这就是指上溢.
如果数据发送太慢,缓冲区的数据都处理空了,输入数据还没过来,硬件还在等待缓冲区有足够数据可以处理,输出接口就在要求发送处理好的数据出去,就是指下溢.

栈的顺序存储知识回顾

在这里插入图片描述

3.1.3栈的链式存储

  1. 定义:采用链式存储的栈称为链栈,且多采用单链表来实现。
  2. 优点:链栈的优点是便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况
  3. 特点:

进栈和出栈都只能在栈顶一端进行(链头作为栈顶)
链表的头部作为栈顶,意味着:(都是对链表的头进行操作)

  • 在实现数据"入栈"操作时,需要将数据从链表的头部插入;
  • 在实现数据"出栈"操作时,需要删除链表头部的首元节点;

因此,链栈实际上就是一个只能采用头插法插入或删除数据的链表;
栈的链式存储结构可描述为:

typedef struct Linknode{ElemType data;              //数据域struct Linknode *next;      //指针域
}*LiStack;                      //栈类型的定义

链栈的基本操作

  • 初始化
  • 进栈
  • 出栈
  • 获取栈顶元素
  • 判空、判满
  1. 带头结点的链栈基本操作:
#include<stdio.h>struct Linknode{int data;             //数据域Linknode *next;       //指针域
}Linknode,*LiStack;   typedef Linknode *Node;   //结点结构体指针变量
typedef Node List;        //结点结构体头指针变量//1. 初始化
void InitStack(LiStack &L){   //L为头指针L = new Linknode; L->next = NULL;
}//2.判栈空
bool isEmpty(LiStack &L){if(L->next == NULL){return true;}elsereturn false;
}//3. 进栈(:链栈基本上不会出现栈满的情况)
void pushStack(LiStack &L, int x){Linknode s;          //创建存储新元素的结点s = new Linknode;s->data = x;//头插法s->next = L->next;L->next = s;
}//4.出栈
bool popStack(LiStack &L, int &x){Linknode s;if(L->next == NULL) //栈空不能出栈return false;s = L->next;x = s->data;L->next = L->next->next;delete(s);return true;
}
  1. 不带头结点的链栈基本操作:
#include<stdio.h>struct Linknode{int data;             //数据域Linknode *next;       //指针域
}Linknode,*LiStack;   typedef Linknode *Node;   //结点结构体指针变量
typedef Node List;        //结点结构体头指针变量//1.初始化 
void initStack(LiStack &L){L=NULL;
}//2.判栈空
bool isEmpty(LiStack &L){if(L == NULL)return true;elseteturn false;
}//3.进栈
void pushStack(LiStack &L, int x){Linknode s;          //创建存储新元素的结点s = new Linknode;s->next = L;L = s;
}//4.出栈
bool popStack(LiStack &L, int &x){Linknode s; if(L = NULL)     //栈空不出栈return false;s = L;x = s->data;L = L->next;delete(s);return true;
}

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

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

相关文章

通过ETL自动化同步飞书数据到本地数仓

一、飞书数据同步到数据库需求 使用飞书的企业都有将飞书的数据自动同步到本地数据库、数仓以及其他业务系统表的需求&#xff0c;主要是为了实现飞书的数据与业务系统进行流程拉通或数据分析时使用&#xff0c;以下是一些具体的同步场景示例&#xff1a; 组织架构同步&#…

9.NIO非阻塞式网络通信入门

highlight: arduino-light Selector 示意图和特点说明 一个 I/O 线程可以并发处理 N 个客户端连接和读写操作&#xff0c;这从根本上解决了传统同步阻塞 I/O 一连接一线程模型。架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。 服务端流程 1、当客户端连接服务端时&…

ADS仿真低噪声放大器学习笔记

ADS仿真低噪声放大器 文章目录 ADS仿真低噪声放大器1. 安装晶体管的库文件2. 直流分析DC Tracing3. 偏置电路的设计4. 稳定性分析5. 输入匹配和输出匹配 设计要求&#xff1a; 工作频率&#xff1a;2.4~2.5GHz ISM频段 噪声系数&#xff1a;NF < 0.7 增益&#xff1a;Gain &…

分享200+个关于AI的网站

分享200个关于AI的网站 欢迎大家访问&#xff1a;https://tools.haiyong.site/ai 快速导航 AI 应用AI 写作AI 编程AI 设计AI 作图AI 训练模型AI 影音编辑AI 效率助手 AI 应用 文心一言: https://yiyan.baidu.com/ 百度出品的人工智能语言模型 ChatGPT: https://chat.openai.c…

人脸检测实战-insightface

目录 简介 一、InsightFace介绍 二、安装 三、快速体验 四、代码实战 1、人脸检测 2、人脸识别 五、代码及示例图片链接 简介 目前github有非常多的人脸识别开源项目&#xff0c;下面列出几个常用的开源项目&#xff1a; 1、deepface 2、CompreFace 3、face_recogn…

【Python 实战】---- 批量识别图片中的文字,存入excel中【使用百度的通用文字识别】

分析 1. 获取信息图片示例 2. 运行实例 3. 运行结果 4. 各个文件的位置 实现 1. 需求分析 识别图片中的文字【采用百度的通用文字识别】;文字筛选,按照分类获取对应的文本;采用 openpyxl 实现将数据存入 excel 中。2. 获取 access_token 获取本地缓存的

网络安全大厂面试题

自我介绍 有没有挖过src&#xff1f; 平时web渗透怎么学的&#xff0c;有实战吗&#xff1f;有过成功发现漏洞的经历吗&#xff1f; 做web渗透时接触过哪些工具 xxe漏洞是什么&#xff1f;ssrf是什么&#xff1f; 打ctf的时候负责什么方向的题 为什么要搞信息安全&#xff0c;对…

数据结构之顺序表

一、概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存 储。在数组上完成数据的增删查改。 顺序表一般可以分为&#xff1a; 1. 静态顺序表&#xff1a;使用定长数组存储元素。 2. 动态顺序表&#xff1a;使用动…

django学习笔记(1)

django创建项目 先创建一个文件夹用来放django的项目&#xff0c;我这里是My_Django_it 之后打开到该文件下&#xff0c;并用下面的指令来创建myDjango1项目 D:\>cd My_Django_itD:\My_Django_it>"D:\zzu_it\Django_learn\Scripts\django-admin.exe" startpr…

Websocket协议-http协议-tcp协议区别和相同点

通讯形式 单工通讯-数据只能单向传送一方来发送数据&#xff0c;另一方来接收数据 半双工通讯-数据能双向传送但不能同时双向传送 全双工通讯-数据能够同时双向传送和接受 注&#xff1a;http的通讯方式是分版本 http1.0&#xff1a;单工。因为是短连接&#xff0c;客户端…

malloc(1) 会分配多大的虚拟内存?

malloc() 分配的是虚拟内存。 如果分配后的虚拟内存没有被访问的话&#xff0c;虚拟内存是不会映射到物理内存的&#xff0c;这样就不会占用物理内存了。 只有在访问已分配的虚拟地址空间的时候&#xff0c;操作系统通过查找页表&#xff0c;发现虚拟内存对应的页没有在物理内…

TEE GP(Global Platform)技术委员会及中国任务小组

TEE之GP(Global Platform)认证汇总 一、TEE GP技术委员会 二、GP中国任务小组 参考&#xff1a; GlobalPlatform Certification - GlobalPlatform

MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索

1、描述异常背景&#xff1a; 因为需要分析数据&#xff0c;待处理excel文件的数据行数太大&#xff0c;手动太累&#xff0c;花半小时写了一个定制的数据入库工具&#xff0c;改成了通用的&#xff0c;整个项目中的万级别数据都在工具上分析&#xff0c;写SQL进行分析&#x…

对原型、原型链的理解

在 JavaScript 中是使用构造两数来新建一个对象的&#xff0c;每一个构造函数的内部都有一个 prototype 属性&#xff0c;它的属性值是一个对象&#xff0c;这个对象包含了可以由该构造西数的所有实例共享的属性和方法。当使用构造函数新建一个对象后&#xff0c;在这个对象的内…

【《React Hooks实战》——指导你使用hook开发性能优秀可复用性高的React组件】

使用React Hooks后&#xff0c;你很快就会发现&#xff0c;代码变得更具有组织性且更易于维护。React Hooks是旨在为用户提供跨组件的重用功能和共享功能的JavaScript函数。利用React Hooks&#xff0c; 可以将组件分成多个函数、管理状态和副作用&#xff0c;并且不必声明类即…

Python实现单例模式

一、介绍 单例模式是一种常见的设计模式&#xff0c;它保证一个类只能被实例化一次&#xff0c;并提供了一个全局访问点来获取这个唯一的实例。在Python中&#xff0c;可以通过使用装饰器、元类或模块等方式实现单例模式。 二、Python实现单例模式的6种方法 1、使用模块实现…

微软、OpenAI用上“数据永动机” 合成数据是晨曦还是暮光?

微软、OpenAI、Cohere等公司已经开始测试使用合成数据来训练AI模型。Cohere首席执行官Aiden Gomez表示&#xff0c;合成数据可以适用于很多训练场景&#xff0c;只是目前尚未全面推广。 已有的&#xff08;通用&#xff09;数据资源似乎接近效能极限&#xff0c;开发人员认为&a…

Java类的默认构造函数

什么情况下存在默认构造函数 说明 如果一个Java类没有显式包含构造函数的声明&#xff0c;那么隐含着有一个默认构造函数。 示例 定义一个类B&#xff0c;没有显式声明构造函数&#xff0c;所以存在一个默认构造函数&#xff1a; package com.thb;public class B {public …

selenium浏览器驱动下载

Chrome谷歌浏览器 下载地址&#xff1a;http://chromedriver.storage.googleapis.com/index.html 不同的Chrome的版本对应的chromedriver.exe 版本也不一样&#xff0c;下载时不要搞错了。 如果是最新的Chrome, 下载最新的chromedriver.exe 就可以了。 Firefox火狐浏览器 驱…

扫地机语音提示芯片,智能家居语音交互首选方案,WT588F02B-8S

智能家居已经成为现代家庭不可或缺的一部分&#xff0c;而语音交互技术正是智能家居的核心。在智能家居设备中&#xff0c;扫地机无疑是最受欢迎的产品之一。然而&#xff0c;要实现一个更智能的扫地机&#xff0c;需要一颗语音提示芯片&#xff0c;以提供高质量的语音交互体验…