首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据结构(三)

数据结构(三)

作者头像
1ess
发布于 2021-11-01 07:25:52
发布于 2021-11-01 07:25:52
26400
代码可运行
举报
文章被收录于专栏:0x7c00的专栏0x7c00的专栏
运行总次数:0
代码可运行

数据结构(三)

發佈於 2019-02-26

本篇,我们将会复习一下基于线性表衍生出的两种数据结构 —— 栈和队列。

栈(Stack)

在软件应用中,栈这种后进先出的数据结构的应用是非常普遍的。比如浏览器的前进后退、Word 和 PhotoShop 等编辑软件中的撤销操作,以及在 iOS 开发中的 push、pop controller 操作都是栈的应用。

栈本质是限定仅在表尾进行插入和删除操作的线性表。 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。 栈又称为后进先出的线性表,简称为 LIFO 结构。

理解栈我们要注意:

  1. 他是一个线性表
  2. 仅允许在表尾进行插入和删除操作,这里的表尾是指栈顶

栈的插入操作,叫做进栈(push),也称为压栈、入栈。 栈的删除操作,叫做出栈(pop),也称为弹栈。

栈的顺序存储结构

栈的顺序存储结构简称为顺序栈。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SqStack<T>
{
    public const int Maxsize = 20;
    public T[] Data = new T[Maxsize];
    public int Top = -1;

    public Status Push(T t)
    {
        if (Top >= Maxsize)
        {
            //栈满
            return Status.Error;
        }

        Top++;
        Data[Top] = t;
        return Status.Ok;
    }

    public Status Pop(out T t)
    {
        if (Top == -1)
        {
            t = default(T);
            return Status.Error;
        }

        t = Data[Top];
        Top--;
        return Status.Ok;

    }
}

栈的链式存储结构

栈的链式存储结构简称为链栈。 对于链栈来说,是不需要头节点的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class LinkStack<T>
{
    public StackNode<T> Top;
    public int Count;

    public Status Push(T t)
    {
        var stackNode = new StackNode<T>(t) {NextNode = Top};
        Top = stackNode;
        Count++;
        return Status.Ok;
    }

    public Status Pop(out T t)
    {
        if (Top == null)
        {
            t = default(T);
            return Status.Error;
        }

        t = Top.Element;
        Top = Top.NextNode;
        Count--;
        return Status.Ok;
    }
}

栈的应用

递归

我们把一个直接调用自己或者通过一系列调用语句间接地调用自己的函数,称为递归函数。 每个递归定义必须至少有一个条件,满足时递归不再进行,即不在引用自身而是返回值退出。 递归回退的顺序是他前进顺序的逆序。显然符合栈这种数据结构。因此编译器使用栈来实现递归。

四则运算表达式求值

一种不需要括号的后缀表示法,也称为逆波兰表示(RPN)。是一种非常巧妙的将四则运算由常见的中缀表达式变为后缀表达式来简化运算复杂性。基本原理也是栈。这里就不详细说明了。

队列(Queue)

队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列是一种先进先出的线性表,简称为 FIFO 结构。 允许插入操作的一端称为队尾,允许删除操作的一端称为队头。

队列在程序设计中使用非常频繁,如消息队列(MQ)所使用的数据结构等。

队列的顺序存储结构

如果我们只把队列当成普通的线性表操作也完全没有问题,入队操作时间复杂度为 O(1),但是出队操作时间复杂度为 O(n),为解决这个问题,我们可以使用循环队列。 我们把队列的这种头尾相接的顺序存储结构称为循环队列。 为了实现循环队列,我们需要引入两个变量,一个指向队头元素所在位置,一个指向队尾元素的下一个位置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SqQueue<T>
{
    public const int Maxsize = 20;
    public T[] Data = new T[Maxsize];
    private int _front;
    private int _rear;

    public Status EnQueue(T t)
    {
        if ((_rear + 1) % Maxsize == _front)
        {
            //队满
            return Status.Error;
        }

        Data[_rear] = t;
        _rear = (_rear + 1) % Maxsize;
        return Status.Ok;
    }

    public Status DeQueue(out T t)
    {
        if (_rear == _front)
        {
            //队空
            t = default(T);
            return Status.Error;
        }

        t = Data[_front];
        _front = (_front + 1) % Maxsize;
        return Status.Ok;
    }

}

队列的链式存储结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class QueueNode<T>
{
    public T Element;
    public QueueNode<T> NextNode;

    public QueueNode(T t)
    {
        Element = t;
    }
}
class LinkQueue<T>
{
    public QueueNode<T> Front, Rear;

    public Status EnQueue(T t)
    {
        var node = new QueueNode<T>(t);
        Front.NextNode = node;
        Rear = node;
        return Status.Ok;
    }

    public Status DeQueue(out T t)
    {
        if (Front == Rear)
        {
            t = default(T);
            return Status.Error;
        }

        t = Front.Element;
        Front = Front.NextNode;
        return Status.Ok;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【图解数据结构】 栈&队列
1.栈 1.1栈的定义 栈(stack)是限定在表尾进行插入和删除的操作的线性表。 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不包含任何数据元素的栈称为空栈。栈又称
撸码那些事
2018/06/21
1.4K0
数据结构(二)
如果用数学语言定义如下: 若将线性表记为(a1, …, ai-1, ai, ai+1, …, an),则表中 ai-1 领先于 ai,ai 领先于 ai+1,称 ai-1 是 ai 的直接前驱元素,ai+1 是 ai 的直接后继元素。当 i = 1, 2, …, n-1 时,ai 有且仅有一个直接后继,当 i = 2, …, n 时,ai 有且仅有一个直接前驱。
1ess
2021/11/01
1930
数据结构——队列
我们在使用手机的时候,偶尔都会碰到过卡住的时候,比如一个地方怎么点都没有用,屏幕也卡住不显示其他东西,但当你把卡住的App关闭掉之后,手机的操作显示就又恢复正常了,其实这就是因为操作系统中的各个程序的指令堆积在一起排队执行,而某一个App卡住的时候,大家都卡住了。
Originalee
2018/08/30
5690
数据结构学习笔记(特殊的线性表:栈与队列)
栈与队列 栈是限定仅在表尾(栈顶)进行插入和删除操作的线性表(后进先出)。 队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表(先进先出)。 栈(Stack): 1.下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作为栈底。 定义一个top变量来指示栈顶元素在数组中的位置。栈顶位置top必须小于存储栈长度StackSize,把空栈的判定条件定位top等于-1。 2.进栈与出栈操作(顺序存储结构): 进栈操作push: /*插入元素e为新的栈顶元素*/ Status Push
希希里之海
2018/05/16
7590
数据结构-栈和队列
我们把类似于弹夹那种先进后出的数据结构称为栈,栈是限定仅在表尾进行插入和删除操作的线性表,我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈,栈又称后进后出的线性表,简称LIFO结构。
张俊红
2018/07/30
4480
数据结构-栈和队列
数据结构 第三章 栈和队列
栈顶:通常将表中允许进行插入、删除操作的一端称为栈顶 (Top),因此栈顶的当前位置是动态变化的,它由一个称为栈顶指针的位置指示器指示。
Twcat_tree
2022/11/29
6870
数据结构 第三章 栈和队列
期末复习之数据结构 第3章 栈和队列
五:写出下列程序段的输出结果(栈的元素类型SElem Type为char)。 1.void main( ){ Stack S; Char x,y; InitStack(S); X=’c’;y=’k’; Push(S,x); Push(S,’a’); Push(S,y); Pop(S,x); Push(S,’t’); Push(S,x); Pop(S,x); Push(S,’s’); while(!StackEmpty(S)){ Pop(S,y);printf(y); }; Printf(x); } 答:输出为“stack”。 2.【严题集3.12②】写出下列程序段的输出结果(队列中的元素类型QElem Type为char)。 void main( ){ Queue Q; Init Queue (Q); Char x=’e’; y=’c’; EnQueue (Q,’h’); EnQueue (Q,’r’); EnQueue (Q, y); DeQueue (Q,x); EnQueue (Q,x); DeQueue (Q,x); EnQueue (Q,’a’); while(!QueueEmpty(Q)){ DeQueue (Q,y);printf(y); }; Printf(x); } 答:输出为“char”。 3.【严题集3.13②】简述以下算法的功能(栈和队列的元素类型均为int)。 void algo3(Queue &Q){ Stack S; int d; InitStack(S); while(!QueueEmpty(Q)){ DeQueue (Q,d); Push(S,d); }; while(!StackEmpty(S)){ Pop(S,d); EnQueue (Q,d); } } 答:该算法的功能是:利用堆栈做辅助,将队列中的数据元素进行逆置。
henu_Newxc03
2021/12/28
7750
期末复习之数据结构 第3章 栈和队列
数据结构与算法(三)栈与队列
一、栈   栈(stack)是限定仅在表尾进行插入和删除操作的线性表,我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈;栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。   理解栈的定义时我们需要注意:首先它是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系,只不过它是一种特殊的线性表而已,定义中说是在线性表的表尾进行插入和删除操作,这里的表尾是指栈顶,而不是栈底。它的特殊之处就在于限制了这个线性表的插入和删除位置,它始终只在栈顶进行,这也就使得:栈底是固定,最先进栈的元素只能在栈底,每当从栈内弹出一个数据,栈的当前容量就-1。   栈的插入操作,叫做进栈,也称为压栈、入栈;栈的删除操作,叫做出栈,也有叫做弹栈;栈对线性表的插入和删除的位置进行了限制,并没有对元素进出的时间进行限制,也就是说,在不是所有元素都进栈的情况下,事先进去的元素也可以出栈,只要保证栈顶元素出栈就可以。   清空栈:就是将栈中的元素全部作废,但找本身的物理空间并不会发生改变(不是销毁);   销毁栈:是要释放掉该栈所占据的物理内存空间;
matinal
2020/11/27
4840
数据结构与算法(三)栈与队列
数据结构学习笔记——队列
线性表有顺序存储和链式存储,栈是线性表,所以有这两种存储方式。同样,队列作为一种特殊的线性表,也同样存在这两种存储方式。
蜻蜓队长
2018/08/03
3410
数据结构学习笔记——队列
来测试一下你对数据结构中的栈和队列的了解有多少?
选择题 1.向一个栈顶指针为top的链栈中插入一个结点s,执行( )。 A.top.next=s; B.s.next=top.next ;top.next=s; C.s.next=top;top=s; D.s.next=top; top=top.next ; 2.栈通常采用的两种存储结构为( )。 A.散列方式和索引方式 B.顺序存储结构和链式存储结构 C.链表存储结构和数组 D.线性存储结构和非线性存储结构 3.一个栈的入栈序列是a,b,c,d,e,则栈的输出序列不可能是( )。 A.e,d,c,b,a
Java学习
2018/04/17
1.3K0
数据结构 第三章栈和队列
假设在周末舞会上,男士和女士们分别进入舞厅,各自排成一队。跳舞开始,依次从男队和女队队头各出一人配成舞伴,若两队初始人数不同,则较长那一队未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。 你需要用队列操作实现上述算法。请完成下面5个函数的操作。
十二惊惶
2024/02/28
3900
数据结构-栈和队列
栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。如下所示:
黄规速
2022/04/14
5730
数据结构-栈和队列
数据结构 | 栈
01 栈的定义 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表。 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称 LIFO 结构。 从上面这两段话,可以确定:首先栈是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系,只不过它是一种特殊的线性表。定义中说在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底。 栈的插入操作,叫做进栈,也叫压栈、入栈。 栈
用户1332428
2018/03/08
7440
数据结构 | 栈
数据结构与算法:队列
队列(Queue)就像是排队买票的人群。想象一下你去电影院看电影,人们在售票窗口形成一条线(队列)等待购票。队列遵循一个很重要的原则:先来先服务(First In, First Out,简称FIFO)。这意味着最先到达并排队的人将会是第一个买到票并离开队列的人,随后到达的人则依次排在队伍的后面,等待买票。
用户11029103
2024/03/19
1270
数据结构与算法:队列
数据结构之栈和队列
​ 在JDK中,Java Stack类是vector的一个子类,继承vector,在util包下。并且只定义了默认构造方法,大部分方法的实现也来源于vector。
归思君
2023/10/16
1940
数据结构之栈和队列
《大话数据结构》(一)
1.数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。
硬核项目经理
2019/08/06
1.1K0
队列(常用数据结构之一)
那么a1为对头元素,an为队尾元素。最早进入队列的元素也会最早出来,只有当最先进入队列的元素都出来以后,后进入的元素才能退出。 在日常生活中,人们去银行办理业务需要排队,这就类似我们提到的队列。每一个新来办理业务的需要按照机器自动生成的编号等待办理,只有前面的人办理完毕,才能轮到排在后面的人办理业务。新来的人进入排队状态就相当于入队,前面办理完业务离开的就相当于出队。队列有两种存储表示:顺序存储和链式存储。采用顺序存储结构的队列被称为顺序队列,采用链式存储结构的队列称为链式队列。 基本运算 InitQueue() ——初始化队列 EnQueue() ——进队列 DeQueue() ——出队列 IsQueueEmpty() ——判断队列是否为空 IsQueueFull() ——判断队列是否已满 顺序队列 由于顺序队列的底层使用的是数组,因此需预先申请一块足够大的内存空间初始化顺序队列。除此之外,为了满足顺序队列中数据从队尾进,队头出且先进先出的要求,我们还需要定义两个指针(top 和 rear)分别用于指向顺序队列中的队头元素和队尾元素。 队列为空时,队头指针front和队尾指针rear都指向下标为0的存储单元,当元素a,b,c,d,e,f,g依次进入队列后,元素a~g分别存放在数组下标为0~6的存储单元中,队头指针front指向元素a,队尾指针指rear向元素g的下一位置。如图所示。
后端码匠
2020/12/09
6460
队列(常用数据结构之一)
数据结构与算法 - 线性表
一、概述 线性表 是具有线性结构特点、最简单且最常用的一种数据结构。 线性表 ( Linear List) 是具有相同特性的数据元素组成的一个有限序列。其元素可以是整数、字符等简单数据,也可以是由多个数据项组成的复合形式,甚至可以是一页书或其他更复杂的信息。         例如,由26个大写英文字母组成的字母表(A,B,C,…,x,Y,Z)就是一个线性表,表中的每个数据元素均是一个大写字母。再如,某高校1990年以来拥有的副教授以上职称的教师个数(48,64,77,93,112,136,167,
且行且珍惜_iOS
2018/12/26
7130
2024重生之回溯数据结构与算法系列学习(7)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
将循环队列臆造为一个环状的空间,即把存储队列元素的表从逻辑上视为一个环,称为循环队列。 基本操作:
盛透侧视攻城狮
2024/10/22
1820
2024重生之回溯数据结构与算法系列学习(7)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构:队列的顺序存储结构(循环队列)
本文介绍了循环队列的实现方式和应用场景,通过对比循环队列和传统队列的差异,阐述了循环队列的优势和劣势。同时,给出了一种基于填充计数的循环队列实现方法,并给出了相应的代码示例。
s1mba
2018/01/03
1.4K0
数据结构:队列的顺序存储结构(循环队列)
相关推荐
【图解数据结构】 栈&队列
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验