Python栈和队列-基础知识回顾

本文回顾了栈和队列的基础知识,包括它们的定义、基本操作和不同存储结构。栈遵循先进后出(LIFO)原则,常见操作有进栈、出栈、读取栈顶元素等;顺序栈和链栈是两种存储结构,共享栈是优化存储空间的一种方式。队列遵循先进先出(FIFO)原则,操作包括入队、出队和获取队头元素,顺序队列和循环队列解决了假溢出问题,链式队列则提供了另一种实现方式。此外,还介绍了双端队列的概念。

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

1.栈的定义

1.栈:只允许在一端进行插入或删除操作的线性表。

2.栈顶:允许删除或插入的一端

3.栈底:不允许删除或插入的一端

4.空栈:不含任何元素的空表

特征:先进后出(LIFO)

 

2.栈的基本操作

Ininstack() 初始化栈

StackEmpty()  判断栈是否为空

Push() 进栈,栈未满情况

Pop() 出栈,栈非空

GetTop() 读取栈顶元素

ClearStack() 销毁栈

 

3.栈的顺序存储结构

1.栈的顺序存储称为顺序栈,它是利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶的位置。

2.栈顶指针:初始时设置top = -1  栈顶元素为 stack[top]

3.进栈操作:栈不满,栈顶指针+1,再送值到栈顶元素。

4.出栈操作:栈非空时 先取栈顶元素值,再将栈顶指针减一。

5.栈空条件:top==-1  栈满条件:top = maxSize -1 ,栈长:top +1

 

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

    思路:两个栈顶指针都指向栈顶元素,top0=-1时0号栈为空,top1=maxSize时一号栈为空。当且仅当两个栈顶指针相邻(top1-top0=1)时,判断为栈满。当0号栈进栈时top0先加一再赋值,1号栈进栈时top1先减一再赋值,出栈则刚好相反。

 

            

 

4.栈的链式存储结构

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

通常采用单链表实现,并规定所有操作都是在单链表的表头进行的。这里规定链栈没有头结点,Lhead指向栈顶元素。

 

5.队列的定义

1.队列:一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。

2.队头:允许删除的一端,又称队首

3.队尾:允许插入的一端。

4.空队列:不含任何元素的空表。

特征:先进先出(FIFO)

 

6.队列的基本操作

InitQueue()  初始化队列

QueueEmpty()  判断列空,若队列Q为空返回true,否则返回false

EnQueue() 入队 队列未满

DeQueue()  出队 队列非空,删除队头元素

GetHead()  获取队头元素

 

7.队列的顺序存储结构

1.队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针front和rear分别指示队头元素和队尾元素的位置。

2.初始状态(队空条件):Q.front==Q.rear==0

3.进队操作:队不满时,先送值到队尾元素,再将队尾指针加1.

4.出队操作:队不空时,先取队头元素值,再将队头指针加1

顺序队列容易造成假溢出。

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

    1.初始时:Q.front=Q.rear=0

    2.队首指针进1:Q.front=(Q.front+1)%MaxSize

    3.队尾指针进1:Q.rear=(Q.rear+1)%MaxSize

    4.队列长度:(Q.rear+MaxSize-Q.front)% MaxSize

    5.出队入队都按顺时针方向进1

    6.如何区分队空队满:

        1.牺牲一个单元来区分队空和队满,入队时少用一个队列单元,约定“队头 指针在队尾指针的下一个位置作为队满的标志

                队满条件:(Q.rear+1)% maxSize==Q.front

                队空条件:Q.front==Q.rear

                队列中元素的个数:(Q.rear - Q.front + MaxSize)%MaxSize

        2.类型中增设表示元素个数的数据成员。队空条件为:Q.size==0;队满的条件为Q.size==MaxSize.这两种情况都有Q.front==Q.rear

        3.类型中增设tag数据成员,以区分是队满还是队空。tag==0,若因删除导致Q.front==Q.rear则为空,tag等于1的情况下,若因插入导致Q.front==Q.rear则为队满。

 

8.队列的链式存储结构

队列的链式表示链队列,他实际上是一个同时带有队头指针和队尾指针的单链表。头指针指向队头结点,尾指针指向队尾结点。

Q.front==NULL且Q.rear==NULL时,链式队列为空。

双端队列:指允许两端都可以进行入队和出队操作的队列

    1.双端队列进队:前端进的元素排在后端进的元素前面,后端进的元素排列在前端进的元素后面

    2.输出受限的双端队列:允许在一端进行插入和删除,但在另一端只允许插入的双端队列称为输出受限的双端队列。

    3.输入受限的双端队列:允许在一端进行插入和删除,但在另一端只允许删除的双端队列称为输入受限的双端队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值