C C++最新【开卷数据结构 】 栈与队列_锡兰cc博客,斗鱼C C++开发二面被刷

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

🔺实现原理

1️⃣判断栈是否空,若空则返回ERROR

2️⃣栈顶指针减1,栈顶元素出栈

💬 代码演示

Status Pop(SqStack &S,SElemType &e)
(//删除S的栈顶元素,用e返回其值
	if(S.top==S.base) return ERROR;//栈顶
	指针减1,将栈顶元素赋给e	   //栈顶指针减1,将栈顶元素赋给e 
	e=*--S.top;
	return OK;
)
(5)取顺序栈的栈顶元素

Q:如何取顺序栈的栈顶元素?

**A:**当栈非空时,此操作返回当前栈顶元素的值,栈顶指针保持不变。

🔺实现原理

1️⃣判断栈是否空

2️⃣返回栈顶元素的值,栈顶指针不变

💬 代码演示

SElemType GetTop (SqStack S)
{//返回s的栈顶元素,不修改栈顶指针
	if(S.top!=S.base) 		        //栈非空
	    return*(S.top-1);			//返回栈顶元素的值,栈顶指针不变
)

🍁链栈

采用链式存储的栈称为链栈。链栈的优点是便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。通常采用单链表实现

栈的顺序存储类型可描述为

typedef struct Linknode
{
	ElemType data;				//数据域
	struct Linknode *next;		//指针域
} *LiStack; 

采用链式存储,便于结点的插入与删除。链栈的操作与链表类似,入栈和出栈的操作都在链表的表头进行。


🌺队列

🍁队列的定义

队列是一种线性表,但限定这种线性表只能在表的一端进行插入,在另一端进行删除。允许删除的一端为队头,又称为队首,允许插入的一端为队尾

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQ2V5bGFuXw==,size_20,color_FFFFFF,t_70,g_se,x_16

队列与生活中的排队一样,最早排队的最先离开,队列的操作特性可以明显地概括为先进先出

队列有两种存储表示,分别为顺序表示与链式表示

🍁队列的顺序表达与实现

(1)队列顺序存储结构

和顺序栈相类似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次列头到队列尾的元素之外。还需附设两个整型变量【front】和【rear】分别指示队列头元素及队间的位置(后面分别称为头指针和尾指针)。

队列的顺序存储结构表示如下:

#define   MAXSIZE    100		//队列容量
typedef   struct 
{   
	ElemType *base;             //存储空间
	int front,rear;            	//队首,队尾
}SqQueue ;

(2)假溢出

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQ2V5bGFuXw==,size_20,color_FFFFFF,t_70,g_se,x_16

图(1)所示为队列的初始状况。此时有【front == rear == 0】 成立。该条件可以作为队列判空的条件。

但是【rear == MAXSIZE】不能作为队列满的条件。为什么呢?

图(4)队列中只有一个元素,仍满足该条件。这时入队出现上溢出。但是这种溢出并不是真正的溢出,在队列中依然存在可以存放元素的空位置,所以是一种假溢出

如何解决循环链表的这一缺点呢?

🍁循环队列

Q:什么是循环队列?

A:将顺序队列臆造成一个环状的空间,即把存储队列元素的表从逻辑上视为一个环,称为循环队列

(1)循环队列的初始化

Q:什么是循环队列的初始化?

**A:**循环队列的初始化就是动态分配一个预定义大小为 MAXSIZE 的数组空间

🔺实现原理

1️⃣为队列动态分配一个最大容量为MAXSIZE的数组空间

2️⃣base指向数组空间的首地址

3️⃣头指针与尾指针置为零,表示队列为空

💬 代码演示

Status InitQueue ( SqQueue  &Q )
{
	Q.base=new  ElemType[MAXSIZE];
	if(!Q.base)	return OVERFLOW;
	Q.front=Q.rear=0;
	return OK;
} 
🌹循环队列的入队

Q:什么是循环队列的入队?

**A:**入队操作是指在队尾插入一个新的元素

🔺实现原理

1️⃣判断队列是否满

2️⃣满了返回ERROR

3️⃣将新元素插入队尾

4️⃣队尾指针加一

💬 代码演示

Status EnQueue(SqQueue &Q,ElemType e)
{
    if((Q.rear+1)%MAXSIZE==Q.front)	//判满			
	    return ERROR;
	Q.base[Q.rear]=e;
	Q.rear=(Q.rear+1)%MAXSIZE;
	return OK;
}

🌹循环队列的出队

Q:什么是循环队列的出队?

**A:**出队操作是删除队头元素

🔺实现原理

1️⃣判断队列是否为空

2️⃣为空返回ERROR

3️⃣保留队头元素

4️⃣队头指针加一

💬 代码演示

Status DeQueue(SqQueue &Q, ElemType &e)
{
    if( Q.rear==Q.front )	 
		return ERROR;			//判空
	e = Q.base[Q.front];
	Q.front = (Q.front+1)%MAXSIZE;	
	return OK;
}

🍁链队列

Q:什么是链队列?

**A:**队列的链式表示称为链队列。它实际上是一个同时带有队头指针和队尾指针的单链表,头指针指向对头结点,尾指针指向队尾结点。

队列的链式存储如图:

eff55ff206e74ce1b5a46473e6cfa91f.png

队列的链式存储类型可描述为:

typedef struct Qnode
{       
	ElemType data;
    struct QNode * next;
}Qnode,*QueuePtr;                  //结点
typedef struct 
{ 
	QueuePtr  front;
	QueuePtr rear;
}LinkQueue;                       //链队  
(1)链栈的初始化

Q:什么是链队列的初始化?

**A:**链栈的初始化操作就是构建一个只有头结点的空队。

🔺实现原理

1️⃣生成新结点作为头结点

2️⃣队头指针和队尾指针指向该结点

3️⃣头指针的指针域置空

💬 代码演示

Status InitQueue(LinkQueue &Q)
{	
	Q.front=Q.rear=new QNode;
	p->next=NULL;
	return OK;
} 

🌹链栈的入队

🔺实现原理

1️⃣为入队元素分配结点空间,用指针p指向

2️⃣将新结点数据域置为e

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

Q.front=Q.rear=new QNode;
p->next=NULL;
return OK;

}



#### 🌹链栈的入队


**🔺实现原理**



> 
> **1️⃣为入队元素分配结点空间,用指针p指向**
> 
> 
> **2️⃣将新结点数据域置为e**


[外链图片转存中...(img-IhQoHOsH-1715726053933)]
[外链图片转存中...(img-swREed49-1715726053933)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值