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

文章目录

栈的基本概念

栈的实现

顺序栈

共享栈

链栈


栈的基本概念

栈的定义

栈(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.mfbz.cn/a/10397.html

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

相关文章

【计算机网络-数据链路层】集线器、网桥、交换机

本文许多文字和图片使用了湖科大教书匠&#xff08;高军老师&#xff09;的 PPT&#xff0c;在此表示感谢。正是他让非科班的我能以奇妙的方式走进网络的世界。 文章目录1 【物理层】集线器&#xff08;Hub&#xff09;——共享式以太网1.1 为什么使用集线器&#xff1f;1.2 集…

macOS Monterey 12.6.5 (21G531) Boot ISO 原版可引导镜像

本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 2023 年 4 月 10 日&#xff08;北京…

ESXI 6.7全面系统教程~汇总

ESXI 6.7全面系统教程 许可证&#xff1a;0A65P-00HD0-375M1-M097M-22P7H esxi 是一个脱机系统&#xff0c;也是一个虚拟机系统与vmware 相比&#xff0c;它可以直接运行在硬件上&#xff0c;这样可以减少资源浪费&#xff0c;一般用于服务器上&#xff1b;下面是esxi 的完整…

stable-diffusion-webui-colab部署记录

stable-diffusion-webui-colab 该模型可以在网上云端部署stable-diffusion&#xff0c;减少本地部署的繁琐步骤降低配置要求的依赖。 一、进入stable-diffusion-webui-colab 1.网址&#xff1a;https://github.com/camenduru/stable-diffusion-webui-colab 在分支中选择driv…

我的创作纪念日:Unity CEO表示生成式AI将是Unity近期发展重点,发布神秘影片预告

PICK 未来的AI技术将会让人类迎来下一个生产力变革&#xff0c;这其中也包括生成型AI的突破性革新。各大公司也正在竞相推出AIGC工具&#xff0c;其中微软的Copilot、Adobe的Firefly、Github的chatGPT等引起了人们的关注。然而&#xff0c;游戏开发领域似乎还没有一款真正针对性…

Vulnhub:Digitalworld.local (Development)靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.130 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --scripthttp-enum 192.168.111.130 查看网站首页源码 访问development目录&#xff0c;提示存在一个流量包 查看流量包发现另一个网站路径&#xff1a;/devel…

java继承类怎么写

继承类是通过把父类的方法和属性继承到一个类中&#xff0c;而子类的方法和属性是子类自己定义的。 Java中有一个很重要的概念叫做继承&#xff0c;这也是 Java语言的精髓所在。Java语言提供了一种机制&#xff0c;叫做派生类。在 Java中&#xff0c;如果没有实现了某个派生类方…

python 调用c++

python中调用c&#xff0c;函数参数用 int类型&#xff0c;返回值为类型1,且返回值为 false。 注意&#xff1a;如果你使用了C中的 false&#xff0c;则返回的是-1。 在 Python中调用C时&#xff0c;你会得到一个名为 bool的类&#xff0c;其中包含了两个成员变量&#xff1a; …

多智能体深度强化学习在移动边缘计算的联合多通道访问和任务卸载中的应用

多智能体深度强化学习在移动边缘计算的联合多通道访问和任务卸载中的应用主要贡献与相关工作比较的贡献三、系统模型&#xff08;only 2 pages&#xff09;3.1 网络模型3.2 通信模型3.3 计算模型3.3.1 本地计算3.3.2 卸载计算四、预备知识&#xff08;only 1 page&#xff09;五…

SpringCloud-Gateway网关搭建整合nacos配置中心实现动态路由整合sentinel实现服务限流熔点降级

官方文档(更多配置详情直接查看官方文档) 为什么需要服务网关 传统的单体架构中只需要开放一个服务给客户端调用&#xff0c;但是微服务架构中是将一个系统拆分成多个微服务&#xff0c;如果没有网关&#xff0c;客户端只能在本地记录每个微服务的调用地址&#xff0c;当需要调…

安全防御 --- 恶意代码、防病毒

一、恶意代码 1、按照传播方式分类 &#xff08;1&#xff09;病毒 概念&#xff1a;病毒是一种基于硬件和操作系统的程序&#xff0c;具有感染和破坏能力&#xff0c;这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地&#xff0c;它是病毒传播的目的地&#xff0…

MySQL库的操作

文章目录&#xff1a;创建数据库字符集和校验规则查看系统默认字符集和校验规则查看数据库支持的字符集查看数据库支持的字符集校验规则校验规则对数据库的影响操作数据库查看数据库显示创建语句修改数据库删除数据库数据库的备份和还原表的备份和还原查看连接情况创建数据库 …

数据库基础

文章目录前言一、什么是数据库二、主流数据库三、基本使用1.连接服务器2.服务器,数据库,表关系3.使用案例4.数据逻辑存储四、MySQL架构五、SQL分类六、存储引擎1.存储引擎2.查看存储引擎3.存储引擎对比总结前言 正文开始!!! 一、什么是数据库 存储数据用文件就可以了,为什么还…

【并发编程】AQS源码

ReentrantLock 互斥锁,可重入 AQS是可以支持互斥锁和共享锁的&#xff0c;这里只分析互斥锁的源码 加锁 公平锁和非公平锁 公平锁 final void lock() {acquire(1); //抢占1把锁.}// AQS里面的方法public final void acquire(int arg) { if (!tryAcquire(arg) &&acq…

IP协议(网络层重点协议)

目录 一、IP协议报头格式 二、地址选择 1、IP地址 &#xff08;1&#xff09;格式 &#xff08;2&#xff09;组成 &#xff08;3&#xff09;分类 &#xff08;4&#xff09;子网掩码 三、路由选择 IP协议是网络层的协议&#xff0c;它主要完成两个方面的任务&#xf…

redis基础(6.0)数据结构、事务、常用组件等

1 概述 1.1 redis介绍 Redis 是互联网技术领域使用最为广泛的存储中间件&#xff0c;它是「Remote Dictionary Service」的首字母缩写&#xff0c;也就是「远程字典服务」。Redis 以其超高的性能、完美的文档、 简洁易懂的源码和丰富的客户端库支持在开源中间件领域广受好评。…

车载网络 - Autosar网络管理 - 常用缩写

为了方便大家日常工作中的使用和交流&#xff0c;每块专业规范或者文章中&#xff0c;都会有或多或少的缩写使用&#xff0c;然而如果一段时间没使用&#xff0c;经常会忘记这些缩写到底代表的是什么意思&#xff0c;为了方便后续内容的介绍&#xff0c;也为了我自己后面忘记后…

做自动化测试时所谓的“难点”

这篇关于自动化测试的文章&#xff0c;可能和你看到的大多数自动化的文章有所不同。我不是一位专职的自动化测试工程师&#xff0c;没有开发过自动化的工具或者框架&#xff0c;用的自动化的工具也不多&#xff0c;也没有做过开发&#xff0c;所以我讲不出那些现在很多人很看重…

JavaScript【一】JavaScript变量与数据类型

文章目录&#x1f31f;前言&#x1f31f;变量&#x1f31f; 变量是什么&#xff1f;&#x1f31f; 变量提升&#x1f31f; 声明变量&#x1f31f; JavaScript有三种声明方式&#x1f31f; 命名规范&#x1f31f; 注意&#x1f31f;数据类型以及运算&#x1f31f; 检测变量数据类…

数据智能服务商奇点云完成近亿元C2轮融资

奇点云集团宣布已于2022年底完成近亿元C2轮融资&#xff0c;余杭国投领投&#xff0c;中银渤海基金跟投。 截至目前&#xff0c;奇点云共获近3亿元C轮融资。C轮领投方包括泰康人寿&#xff08;旗下泰康资产执行&#xff09;、余杭国投&#xff0c;跟投方包括字节跳动、德同资本…