[考研数据结构]第3章之栈的基本知识与操作

news2024/10/6 1:44:23

文章目录

栈的基本概念

栈的实现

顺序栈

共享栈

链栈


栈的基本概念

栈的定义

栈(Stack)是只允许在一端进行插入或删除操作的线性表

 相关术语

  • 栈顶(Top)线性表允许进行插入或删除的那一端称之为栈顶
  • 栈底(Bottom)是固定的,不允许插入或者删除的另一端
  • 空栈(Null Stack)不含任何数据元素的空表

重要特性

  • 后进先出(Last In First Out):即先入栈的元素后出栈
  • 如入栈顺序为a1,a2,a3,a4 ,则出栈顺序为a4,a3,a2,a1


栈的实现

顺序栈

定义

        采用顺序存储的栈称之为顺序栈,它利用一组地址连续的存储单元存放自栈底至栈顶的数据元素,同时附设一个指针top,指向当前栈顶的位置

基本操作

顺序存储类型

//栈的存储类型定义
typedef struct Stack{
	int data[MaxSize];//存放栈中元素
	int top;//指向当前栈顶元素 
}SqStack;

 初始化

//初始化
void InitStack(SqStack &S){
	S.top=-1;//初始化栈顶指针,指向当前的栈顶位置 
} 

判空

//判空
bool IsEmpty(SqStack &S){
	if(S.top==-1)
		return true;
	else 
		return false;
} 

判满

//判满
bool IsFull(SqStack &S){
	if(S.top==MaxSize-1)
		return true;
	else 
		return false;
} 

入栈(进栈)

//入栈(进栈)
bool Push(SqStack &S,int x){
	//栈满则报错,无法入栈 
	if(S.top==MaxSize-1)
		return false;
	S.data[++S.top]=x;//因为栈顶指针初始化为-1指向当前位置,故增加元素时应先令top加一再入栈 
	return true;
}

出栈

//出栈
bool Pop(SqStack &S,int &x){
	//栈空则报错,无法出栈 
	if(S.top==-1)
		return false;
	x=S.data[S.top--];//先出栈,指针再减一
	return true; 
} 

读取栈顶元素

//读取栈顶元素
bool GetTop(SqStack &S,int &x){
	//栈空则报错,无法读取 
	if(S.top==-1)
		return false;
	x=S.data[S.top];
	return true;
} 

测试

#include"stdio.h"
#include"stdlib.h"
#define MaxSize 10
//栈的存储类型定义
typedef struct Stack{
	int data[MaxSize];//存放栈中元素
	int top;//指向当前栈顶元素 
}SqStack;

//初始化
void InitStack(SqStack &S){
	S.top=-1;//初始化栈顶指针,指向当前的栈顶位置 
} 
//判空
bool IsEmpty(SqStack &S){
	if(S.top==-1)
		return true;
	else 
		return false;
} 
//判满
bool IsFull(SqStack &S){
	if(S.top==MaxSize-1)
		return true;
	else 
		return false;
} 
//求栈长
int StackLength(SqStack &S){
	return S.top+1;
} 
//入栈(进栈)
bool Push(SqStack &S,int x){
	//栈满则报错,无法入栈 
	if(S.top==MaxSize-1)
		return false;
	S.data[++S.top]=x;//因为栈顶指针初始化为-1指向当前位置,故增加元素时应先令top加一再入栈 
	return true;
} 
//出栈
bool Pop(SqStack &S,int &x){
	//栈空则报错,无法出栈 
	if(S.top==-1)
		return false;
	x=S.data[S.top--];//先出栈,指针再减一
	return true; 
} 
//读取栈顶元素
bool GetTop(SqStack &S,int &x){
	//栈空则报错,无法读取 
	if(S.top==-1)
		return false;
	x=S.data[S.top];
	return true;
} 
//打印栈中所有元素
void PrintStack(SqStack &S){
	printf("\n当前栈中元素如下:\n");
	for(int i=S.top;i>=0;i--){
		printf("%d ",S.data[i]);
	}
	printf("\n");
} 
//测试 
int main(){
	SqStack S;
	//1.初始化栈
	InitStack(S);
	//2.入栈
	printf("请输入10个整数进行入栈:\n");
	int n;
	for(int i=0;i<10;i++){
		scanf("%d",&n);
		Push(S,n);
	} 
	PrintStack(S);
	//3.出栈 
	 printf("请输入你要出栈的次数:\n");
	 int x,times;//x带回被删除的栈顶元素 ,times为出栈次数 
	 scanf("%d",&times);
	 if(times>StackLength(S)){
	 	printf("出栈次数不合法!");
	 }else{
	 	printf("依次出栈的元素如下:\n");
	 	for(int i=0;i<times;i++){
	 		Pop(S,x);
	 		printf("%d ",x);
	 	}
	 } 
	 PrintStack(S);
	return 0;
} 

/*
测试数据:
1 2 3 4 5 6 7 8 9 10 
*/

 

共享栈

概念

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

性质

以上图所示的共享栈为例:

  • top1= -1,1号栈为空;当top2=MaxSize=10时,2号栈为空
  • top2-top1=1 时,即两个栈顶指针相邻时,则栈满
  • 当1号栈入栈时,top1先加1再赋值;当2号栈入栈时,top2先减1再赋值
  • 出栈时与入栈时相反

代码实现

存储类型

//共享栈的存储结构类型
typedef struct CommonStack{
	int data[MaxSize];
	int top1;
	int top2;
}ComStack; 

初始化

//初始化共享栈
void InitComStack(ComStack &S){
	S.top1=-1;
	S.top2=MaxSize;
} 

入栈

//共享栈的入栈
bool Push(ComStack &S,int StackType,int x){
	//判满 
	if(S.top2-S.top1==1)
	   return false;
	//说明是1号栈入栈 
	if(StackType==1){
		S.data[++S.top1]=x;
	}else if(StackType==2){//说明是2号栈入栈 
		S.data[--S.top2]=x;
	}
	return true;
} 

出栈

// 共享栈的出栈
bool Pop(ComStack &S,int StackType,int &y){
	//判空
	if(S.top1==-1&&S.top2==MaxSize)
		return false;
    //说明是1号栈出栈 
	if(StackType==1){
		y=S.data[S.top1--];
	}else if(StackType==2){//说明是2号栈出栈 
		y=S.data[S.top2++];
	}
	return true;
} 

测试

#include"stdio.h"
#include"stdlib.h"
#define MaxSize 10
//共享栈的存储结构类型
typedef struct CommonStack{
	int data[MaxSize];
	int top1;
	int top2;
}ComStack; 

//初始化共享栈
void InitComStack(ComStack &S){
	S.top1=-1;
	S.top2=MaxSize;
} 
//共享栈的入栈
bool Push(ComStack &S,int StackType,int x){
	//判满 
	if(S.top2-S.top1==1)
	   return false;
	//说明是1号栈入栈 
	if(StackType==1){
		S.data[++S.top1]=x;
	}else if(StackType==2){//说明是2号栈入栈 
		S.data[--S.top2]=x;
	}
	return true;
} 
// 共享栈的出栈
bool Pop(ComStack &S,int StackType,int &y){
	//判空
	if(S.top1==-1&&S.top2==MaxSize)
		return false;
    //说明是1号栈出栈 
	if(StackType==1){
		y=S.data[S.top1--];
	}else if(StackType==2){//说明是2号栈出栈 
		y=S.data[S.top2++];
	}
	return true;
} 
int main(){
	ComStack S;
	//初始化共享栈
	InitComStack(S);
	//入栈
	int a1,a2;
	printf("请输入5个整数进入1号栈:\n");
	for(int i=0;i<5;i++){
		scanf("%d",&a1);
		Push(S,1,a1);
	} 
	printf("请再输入5个整数进入2号栈:\n");
	for(int i=0;i<5;i++){
		scanf("%d",&a2);
		Push(S,2,a2);
	} 
	printf("共享栈内元素如下:\n");
	for(int i=0;i<10;i++){
		printf("%d ",S.data[i]);
	} 
	printf("\n");
	int y,type;
	printf("请输入你要执行出栈操作的栈号:");
	scanf("%d",&type);
	Pop(S,type,y);
	printf("已成功将%d号栈的栈顶元素:%d 弹出栈!\n",type,y);
	printf("此时共享栈内的元素如下:\n");
	//打印1号栈 
	for(int i=0;i<=S.top1;i++){
		printf("%d ",S.data[i]);
	}
	//打印2号栈 
	for(int j=S.top2;j<10;j++){
		printf("%d ",S.data[j]);
	}
	return 0;
} 

链栈

        顾名思义,采用链式存储的栈称之为链栈。其优点是便于多个栈共享存储空间和提高效率,且不存在栈满上溢的情况,通常采用单链表实现,并规定所有的操作都只能在单链表的表头进行。

 由于链栈是用单链表实现,且规定只在表头进行操作,故链栈的操作与单链表类似,入栈和出栈都在单链表的表头进行,注意带头结点与不带头结点的区别,操作上会有所不同,具体可以参考我之前写的文章。

单链表的基本知识与基本操作https://blog.csdn.net/qq_52487066/article/details/129604063?spm=1001.2014.3001.5501

 END.

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

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

相关文章

JAVASE基础(二)

这里写目录标题JAVASE基础11.科学计数法12.编码和字符集12.编译格式问题13.类型转换类型级别自动类型转换强制类型转换特殊情况14.final修饰符a.修饰变量b.修饰方法c.修饰类15.scanner使用16.两个数交换引入中间变量位运算数学数方法一数学计数方法二17.扩展赋值运算符&#xf…

递归算法_字符串反转_20230412

递归算法-字符串反转 前言 递归算法对解决重复的子问题非常有效&#xff0c;字符串反转也可以用递归算法加以解决&#xff0c;递归算法设计的关键是建立子问题和原问题之间的相关性&#xff0c;同时需要确立递归退出的条件&#xff1b;如果递归退出的条件无法确定&#xff0c…

【LeetCode: 面试题 17.13. 恢复空格 | 暴力递归=>记忆化搜索=>动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Redis安装和配置

目录本章重点Redis安装Redis启动和停止配置后台启动连接前的配置本章重点 主要掌握安装和启动了解redis的配置文件进行配置掌握Redis几种启动方式 Redis安装 下载 Redis官网 点击下载 解压 然后将下载好的压缩包上传到服务器,进行解压! tar zxvf 进行解压 编译 我们要进行编…

4.12每日一练

题目&#xff1a;给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外&#xff0c;这两个数…

学生信息管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87673902 更多系统资源库…

安全运营场景下的机器学习算法应用

观测到一个有意思的现象&#xff1a; 假设把安全划分为 基础安全 和 业务安全&#xff0c;PR类的议题中&#xff0c;会出现分级&#xff1a;基础安全领域&#xff0c;喜欢讲纵深防御&#xff0c;给出一个炫酷的架构图&#xff0c;然后各种技术关键字往上标&#xff1b;业务安全…

Doris集群的安装部署

目录 安装与部署 软硬件配置​ 1、机器选择 2、软件选择 3、环境信息修改和部署架构 4、安装部署Doris 5、启动FE 6、在FE节点启动MySQL客户端 7、在BE节点启动be 8、查看BE状态 8、查看FE状态是否正常 WEBUI 官方建议 安装与部署 该文档主要介绍了部署 Doris 所…

如何压缩Outlook数据文件大小

由于 Outlook 需要管理大量的电子邮件&#xff0c;Outlook 偶尔会出现问题是很正常的。 但是&#xff0c;如果你注意到 Outlook 打开或加载的时间过长&#xff0c;这可能是一个严重的问题。此外&#xff0c;你还可能面临其他问题&#xff0c;比如收件箱加载时间过长&#xff0…

WebWorker、ThreeJs的渲染和控制

在 ios16.4 版本中已经开始支持了 OffscreenCanvas &#xff0c;那看样子&#xff0c;是时候再把Three做一波优化了 背景介绍 在之前的项目经验中&#xff0c;如果使用threejs加载比较大的3d场景&#xff0c;那么在创建 threejs 的对象和绘制的时候&#xff0c;会占用浏览器线…

认识C++《共、枚、指1》

目录 前言: 1.共用体的基本知识 2.匿名共用体 3.枚举 3.1设置枚举值 3.2枚举的应用场景 3.3枚举变量的取值范围 4.地址和自由存储空间 5.指针的思想 6.指针的声明和初始化 前言: 指针内容比较多&#xff0c;还需要再出一篇。久等了&#xff01;&#xff01;我看了我的…

数据库中的视图及三级模式结构

文章目录一、视图二、数据库三级模式结构一、视图 简单地说&#xff0c;视图可以看成是一个窗口&#xff0c;它所反映的是一个表或若干表的局部数据&#xff0c;可以简化查询语句。视图一经定义&#xff0c;用户就可以把它当作表一样来查询数据。 但视图和基本表不同&#xf…

Python算法设计 - Karatsuba乘法

版权声明&#xff1a;原创不易&#xff0c;本文禁止抄袭、转载&#xff0c;侵权必究&#xff01; 目录一、Karatsuba 乘法二、算法思路三、Python算法实现四、作者Info一、Karatsuba 乘法 当你在纸上做两个数字的乘法时&#xff0c;一般我们都是用小时候学到的方法&#xff1a…

22.SSM-JdbcTemplate总结

目录 一、JdbcTemplate对象。 &#xff08;1&#xff09;Spring产生JdbcTemplate对象。 &#xff08;2&#xff09;JdbcTemplate常用操作。 &#xff08;3&#xff09;知识要点。 一、JdbcTemplate对象。 &#xff08;1&#xff09;Spring产生JdbcTemplate对象。 这个是Sp…

AIGC大模型时代下,该如何应用高性能计算PC集群打造游戏开发新模式?

ACT | SIM | ETC | FTG | RAC AVG | RPG | FPS | MUG | PUZ ACT、SIM、ETC、FTG、RAC、RTS、STG、AVG、RPG、FPS、MUG、PUZ、SLG、SPG等游戏类型&#xff0c;需要高性能的计算机来支持运行。为了满足这些游戏的需求&#xff0c;国内服务器厂商不断推出新的产品&#xff0c;采用…

定点数加减运算

定点数加减运算 文章目录定点数加减运算格式相同位宽相同但不同格式运算位宽不同的定点数运算1.转换为S5.10格式的相同位宽2.统一转换为S10.5格式的相同位宽定点数运算可直接通过处理器内置的整数单元实现格式相同 加减法就是对应二进制形式的有符号整数的加减运算 例如 2.71…

[Date structure]时间/空间复杂度

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现&#xff0c;有时候有C/C代码。 ⭐如果觉得文章写的…

手写锚点,且随着滚动屏幕自动高亮

入上图效果 通过判断几个id对应的dom离滚动区域上方的高度跟滚动区域高度对比高亮锚点 <template><div v-loading"totalLoading" class"define-target-container"><el-radio-group v-model"ucatsType" class"ucats-setti…

AUTOSAR Gateway介绍

概述 熟悉整车电子架构的朋友们都知道,Gateway(网关)在整车网络架构中协调不同物理链路数据的交换,发挥着数据中枢作用。本文为大家介绍AUTOSAR架构中Gateway的应用方式。 在AUTOSAR架构中,Signal、Signal Group或者PDU从一个源总线接收可以发送到一个或相同或不同协议的总…

ChatGPT可以做WebRTC音视频质量性能优化,惊艳到我了

摘要 随着GPT-4的发布&#xff0c;AI的风越吹越旺。GPT-4可以回答问题&#xff0c;可以写作&#xff0c;甚至可以基于一张草图生成html代码搭建一个网站。即构社区的一位开发者倪同学就基于目前在研究的WebRTC QoS技术点对GPT-3.5跟GPT-4进行一场实验&#xff0c;ChatGPT会取代…