数据结构第三章——栈与队列

本文详细介绍了栈(包括顺序栈和链栈)的概念、操作以及在括号匹配、表达式求值和递归中的应用;同时探讨了队列(顺序队列、循环队列和链式队列)的基本概念、操作和在层次遍历及计算机系统中的运用,为IT技术学习者提供基础知识梳理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、思维导图

二、栈

1.栈的基本概念

(1)栈的定义

栈是只允许在表的一端进行插入和删除操作的线性表,

(2)栈的特点

卡特兰数:n个不同的元素进栈时,出栈元素不同排列的个数为

2.栈的基本操作

这些基本操作可直接在答案中调用

3.栈的存储结构

(1)顺序栈

顺序栈是栈的重点,而链栈基本上与链表保持一致,所以这里重点讨论顺序栈;实际应用中更多的也是顺序栈。

顺序栈的存储结构与顺序表一样,一般也有两种表示方式:静态分配,动态分配;

静态分配

(参考王道版本)

//顺序栈的存储结构——静态分配
#define maxsize 100 
typedef struct{
	int Data[maxsize];//开一个长度为100的数组,用作栈
	int top           //定义top指针; 
}SqStack; 

初学者可能会在这里产生一点疑惑,为什么在这里定义一个int型的变量可以将其称之为指针呢?这里的指针并不是真正意义上的指针,我们知道,真正的指针存放的是一个地址,在这个栈(数组)中其实地址就是0,1,2,3,4,5......0号地址第一个元素,1号地址存第二个元素......,所以用top变量用来存放栈顶元素在数组当中的哪个位置。

此外,用静态分配的方式来表示一个栈时,我们只用了一个栈顶指针,没有用栈底指针,栈底指针是固定在栈底的,所以有没有都一样。我们需要重点关注的时栈顶指针的指向,在这里,栈顶指针一般是两种指向方式,两种指向方式的不同会导致一些具体操作的不同,为方便表示,我用手写的方式呈现:

下面基本操作仅以s.top=-1表示,s.top=0类比,很简单的 

初始化
void InitSqStack(SqStack &S){
	s.top=-1;
}
判断空
bool SqStackEmpty(SqStack &S){
	if(s.top==-1){
		return true;
	}
	else{
		return false;
	}
}
入栈
//入栈
bool Push(Sqstack &S,int x){
	//首先判断空是否满
	if(s.top==maxsize-1){
		return false;
	} 
	s.Data[++S.top]=x;
	/*
	s.Data[++S.top]=x;
	这一行代码就是
	s.top=s.top+1;
	s Data[s.top]=x; 
	*/
	return true; 
} 
出栈
//出栈 
bool Pop(Sqstack &s,int &x){
	//首先需要判断栈是否为空
	if(s.top==-1){
		return false;	
	} 
	x=s.Data[s.top--];
	/*
	x=s.Data[s.top--];
	这行代码等效于
	x=s.Data[s.top];
	s.top=s.top-1; 
	*/ 
	return true
} 
读取栈顶元素
//读栈顶元素
int GetTop(SqStack S,int &x){
	//首先需要判空
	if(s.top==-1){
		return false;
	} 
	x=s.Data[s.top]; 
	//这里将栈顶元素,赋值给变量x,因为这里参数传来的是&x(可以理解为x的地址)
	//在这个函数内部修改x的值(也就是将栈顶元素赋值给x)在函数外,x的值同样被修改
	//所以直接返回bool型即可,此时x的值已经被“返回”了; 
	return true;
} 
动态分配

所谓的顺序栈的动态分配就是利用malloc函数在内存中动态的分配内存空间用来存放数据。下面我说明一下这个所谓的动态分配,首先看malloc函数,malloc函数的作用就是在内存中开辟一段地址连续的空间(更详细的内容请看c语言库函数)然后在这段地址连续的空间内进行操作,当空间存满时,就会动态分配,这时候一般使用realloc函数比如(int *)realloc(sizeof(int )*n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值