栈和队列(1)——栈
栈的基本概念
1. 栈的定义:只允许在一端进行插入或删除操作的线性表(可以理解为操作受限的线性表)。
2. 栈的特点:后进先出(LIFO)。
3. 栈的基本操作:初始化、销毁、进栈、出栈、读栈顶元素等。
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。

栈的常考题型:进栈顺序与出栈顺序的关系。
n个不同的元素进栈,出栈元素不同排列的个数为
栈的顺序存储实现(顺序栈)
顺序存储:给各个数据元素分配连续的存储空间,大小为MaxSize*sizeof(ElemType)。
顺序栈的定义
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{ElemType data[MaxSize]; //静态链表中存放栈中元素int top; //指向栈顶元素
} SqStack;
我们通过top的值指向栈顶元素,即top的范围数组索引值[0,n-1]。因此如果栈是空栈,就令top=-1。
顺序栈的初始化与判断栈空
void InitStack(SqStack &S){S.top==-1; //初始化栈顶指针
}
bool StackEmpty(SqStack S){if(S.top==-1)return true;elsereturn false;
}
新元素入栈
bool PushStack(SqStack &S,ElemType x){if(S.top==MaxSize-1) //判断是否满栈return false;S.data[++S.top]==x;return true;
}
由于S.top是索引指向当前的栈顶位置,因此S.data[++S.top]==x,而不是S.data[S.top++]==x。对于后者我们可以采取另一种方式——让top指向下一个可以插入的位置,这时需要将top初始化为0,判断栈满的条件也变成了:top==MaxSize。
出栈
bool PopStack(SqStack &S,ElemType &x){if(S.top==-1) //栈空,报错return false;x=S.data[S.top--];return true;
}
读取栈顶元素
bool GetTop(SqStack S,ElemType &x){if(S.top==-1)return false;x=S.data[S.top]; //记录栈顶元素,引用返回return true;
}
顺序栈的缺点:栈的大小不可变。
共享栈
共享栈:两个栈共享同一片存储空间,这片存储空间不单独属于任何一个栈,某个栈需要的多一点,它就可能得到更多的存储空间;
两个栈的栈底在这片存储空间的两端,当元素入栈时,两个栈的栈顶指针相向而行。
栈满的条件:top0+1=top1;(top是int类型,是数组的索引值)

#define MaxSize 10
typedef struct{ElemType data[MaxSize];int top0; //0号栈栈顶指针int top1; //1号栈栈顶指针
} ShStack;
void InitStack(ShStack &S){S.top0=-1;S.top1=MaxSize;
}
链栈
1. 栈的链式存储实现通过单链表模拟,进栈采用头插法。
2. 出栈操作对应单链表的删除操作,需对头结点进行“后删”处理。
3. 链栈定义及初始化,带头结点的链栈便于操作。
#include<stdlib.h>
#include<stdio.h>#define MAXSIZE 10typedef int ElemType;typedef struct Linknode {ElemType data;struct Linknode*next;
}*LiStack;
带头结点的链栈

//初始化
void InitLiStack(LiStack &s){s=(Linknode*)malloc(sizeof(Linknode));if(s==NULL){printf("内存分配失败!\n");return ;}s->next=NULL;printf("空间申请成功!\n");
} //销毁
void DestryLiStack(LiStack &s){Linknode* p=s->next;while(p!=NULL){Linknode* r=p;p->next=r->next;free(r);}free(s);printf("销毁成功!\n");
} //入栈
void PushLiStack(LiStack &s,ElemType e){Linknode* r=(Linknode*)malloc(sizeof(Linknode));r->data=e;r->next=s->next;s->next=r;printf("插入节点成功!\n");
} //出栈
void PopLiStack(LiStack &s,ElemType &e){if(s->next==NULL){printf("栈空!\n");return;}Linknode* p=s->next;e=p->data;s->next=p->next;free(p);printf("出栈成功!\n");
} //获取栈顶节点
Linknode* GetElem(LiStack &s,ElemType &e){if(s->next==NULL){printf("栈空!\n");return NULL;}Linknode* p=s->next;e=p->data;
}
不带头结点的链栈

//初始化
void InitLiStack(LiStack &s){s=NULL;printf("申请空间成功!\n");
} //销毁
void DestryLiStack(LiStack&s){Linknode* p=s;while(p->next!=NULL){Linknode* r=p;p=r->next;free(r);}//最后一个节点特殊处理free(p); printf("销毁成功!\n");
} //入栈
void PushLiStack(LiStack &s,ElemType e){//如果开始没有节点,特殊处理 if(s==NULL){Linknode* r=(Linknode*)malloc(sizeof(Linknode));r->data=e;r->next=NULL;s=r;printf("插入节点成功!\n"); return ; } Linknode* r=(Linknode*)malloc(sizeof(Linknode));//首先将头结点的值修改为要插入的值e,将r->data=s->data,最后直接在头结点后面插入节点r即可 r->data=s->data;s->data=e;r->next=s->next;s->next=r;printf("插入节点成功!\n");
} //出栈
void PopLiStack(LiStack &s,ElemType &e){if(s==NULL){printf("栈空!\n");return;}//只有一个节点的时候特殊处理 if(s->next==NULL){e=s->data; free(s);return ;} Linknode* p=s;e=p->data;s->next=p->next;free(p);printf("出栈成功!\n");
} //获取栈顶节点
Linknode* GetElem(LiStack &s,ElemType &e){if(s==NULL){printf("栈空!\n");return NULL;}Linknode* p=s;e=p->data;
} 相关文章:
栈和队列(1)——栈
栈的基本概念 1. 栈的定义:只允许在一端进行插入或删除操作的线性表(可以理解为操作受限的线性表)。 2. 栈的特点:后进先出(LIFO)。 3. 栈的基本操作:初始化、销毁、进栈、出栈、读栈顶元素等…...
Java中的反射(Reflection)
先上两张图来系统的看一下反射的作用和具体的实现方法 接下来详细说一下反射的步骤以及之中使用的方法: 获取Class对象: 要使用反射,首先需要获得一个Class对象,该对象是反射的入口点。可以通过以下几种方式获取Class对象&#x…...
【IC验证】linux系统下基于QuestaSim的systemverilog仿真TCL命令
linux系统下基于QuestaSim的systemverilog仿真TCL命令 一.终端打开QuestaSim二.QuestaSim中TCL脚本指令1.仿真库的创建(vlib)-非必要2.编译命令(vlog)3.仿真命令(vlog)4.运行命令(run࿰…...
Python图像处理库PIL,实现旋转缩放、剪切拼接以及滤波
文章目录 切割缩放和旋转拼接 PIL的Image类,提供了一些常用的图像处理方法。 切割缩放和旋转 PIL可以很方便地实现如下效果 代码如下 from PIL import Image path lena.jpg img Image.open(path) # 读取 img.resize((50, 50), resampleImage.Resampling.NEARE…...
xhr的readyState和status
XMLHttpRequest(XHR)对象中的readyState和status用于监控异步 HTTP 请求的状态。它们分别表示请求的当前阶段和服务器的响应状态。 readyState 用于判断请求所处的阶段,确保数据完全接收。 status 用于判断请求的结果状态(如200表…...
Rust 力扣 - 238. 除自身以外数组的乘积
文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 这题主要有个关键点,就是元素能取0,然后我们分类讨论元素为0的数量 如果数组中存在至少两个元素为0,则每个元素的除自身以外的乘积为0如果数组中仅存在一个0,则为…...
【Vue框架】基础语法练习(1)
其实更多知识点已经在Vue.js官网十分清楚了,大家也可以去官网进行更细节的学习 https://cn.vuejs.org/ 说明:目前最新是Vue3版本的,但是Vue2已经深得人心,所以就是可以支持二者合用。它们最大的区别就是Vue3是组合式API…...
开源一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码
大家好,我是一颗甜苞谷,今天分享一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码。 前言 在当前的物流仓储行业,企业面临着信息化升级的迫切需求,但往往受限于高昂的软件采购和维护成本。现有的…...
开源一套基于若依的wms仓库管理系统,支持lodop和网页打印入库单、出库单的源码
大家好,我是一颗甜苞谷,今天分享一款基于若依的wms仓库管理系统,支持lodop和网页打印入库单、出库单的源码。 前言 在当今快速发展的商业环境中,库存管理对于企业来说至关重要。然而,许多企业仍然依赖于传统的、手动…...
HTML+JavaScript案例分享: 打造经典俄罗斯方块,详解实现全过程
在本文中,我们将深入探讨如何使用 JavaScript 实现经典的俄罗斯方块游戏。俄罗斯方块是一款广为人知的益智游戏,通过操纵各种形状的方块,使其在游戏区域内排列整齐,以消除完整的行来获得分数。 效果图如下: 一、游戏界面与布局 我们首先使用 HTML 和 CSS 来创建游戏的界面…...
【网页布局技术】项目五 使用CSS设置导航栏
《CSSDIV网页样式与布局案例教程》 徐琴 目录 任务一 制作简单纵向导航栏支撑知识点1.合理利用display:block属性2.利用margin-bottom设置间隔效果3.利用border设置特殊边框 任务二 制作简单横向导航栏任务三 制作带图片效果的横向导航栏任务…...
自学网络安全,网络安全入门学习路线,收藏这篇就够了
在当今高度数字化的时代,网络安全已经成为了一个至关重要的领域。随着网络威胁的不断演变和增长,对于专业网络安全人才的需求也在急剧上升。对于那些对网络安全充满热情并且渴望自学成才的人来说,制定一个系统、全面且高效的学习路线和规划是…...
React Query已过时?新一代请求工具横空出世
大家好!今天我想和你们聊聊一个让我兴奋不已的话题 —— 分页列表请求策略。你们知道吗?这个策略真的帮了我大忙!它不仅让我的代码更简洁,还大大提升了用户体验。说实话,每次用到这个功能,我都忍不住赞叹。…...
视频怎么进行格式转换?6款视频转换MP4格式的免费软件!
在数字时代,视频格式的多样性为我们提供了丰富的观看和编辑选择,但同时也带来了格式不兼容的困扰:MOV、AVI、WMV、MKV……这些格式多多少少都会遇到因不兼容而无法播放或下载分享的场景。当你想要将视频文件从一种格式转换为另一种格式&#…...
智能文档处理平台:免费体验智能化医疗信息提取
前提:医疗行业信息碎片化问题普遍,手工数据录入效率低且易错,导致数据管理难度大。本系统可帮助医疗机构在信息管理上迈向智能化,优化流程并提升效率。 系统概述: 思通数科推出的智能文档处理系统,专为解…...
Java 中 InputStream 的使用:try-with-resources 与传统方式的比较
在 Java 中,处理输入输出流时,确保资源的正确管理至关重要。特别是 InputStream 这样的流,一旦使用完成,必须正确关闭以释放资源。本文将对两种常见的资源管理方式进行比较:try-with-resources 语句和传统的 try-catch…...
【MATLAB源码-第271期】基于matlab的雷达发射回波模拟,包括匹配滤波,加窗旁瓣控制,以及MTD处理。
操作环境: MATLAB 2022a 1、算法描述 雷达系统是一种广泛应用于目标探测和跟踪的技术,其核心在于发射电磁波并分析返回信号。本文将探讨雷达发射波形、回波信号的模拟、匹配滤波的过程、加窗控制旁瓣的策略以及慢时间MTD处理的整体系统框架。 一、雷…...
Linux系统编程——信号量
一、信号量的定义和原理 1、概念 原子操作:不可中断的一个或者一系列的操作,即一件事要么做要么不做。临界资源:不同进程能够看到的一份公共资源,一次只能被一个进程使用。PV操作:由于信号量只能进行两种操作等待和发…...
Oracle索引问题汇总
一、oracle 数据库TIMESTAMP 时间字段,设置索引后,通过该字段进行排序,索引排序不生效问题 1. 记录下在工作中遇到的一次索引问题 问题描述: 数据库:oracle; 日志记录表中的一个创建时间(create…...
基于QT用工厂模式实现串口通信与网络通信激光器的控制
配置文件网络配置:IP+Port 串口配置:端口号+波特率 首先,我们需要创建一个配置文件 config.ini,内容如下: [SerialLaser] portName = COM1 baudRate = 9600[NetworkLaser] ipAddress = 192.168.1.1 port = 1234两类激光器的实现: #include <QCoreApplicat…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
【技巧】dify前端源代码修改第一弹-增加tab页
回到目录 【技巧】dify前端源代码修改第一弹-增加tab页 尝试修改dify的前端源代码,在知识库增加一个tab页"HELLO WORLD",完成后的效果如下 [gif01] 1. 前端代码进入调试模式 参考 【部署】win10的wsl环境下启动dify的web前端服务 启动调试…...
从数据报表到决策大脑:AI重构电商决策链条
在传统电商运营中,决策链条往往止步于“数据报表层”:BI工具整合历史数据,生成滞后一周甚至更久的销售分析,运营团队凭经验预判需求。当爆款突然断货、促销库存积压时,企业才惊觉标准化BI的决策时差正成为增长瓶颈。 一…...
