数据结构之栈和队列

一、栈

1.1 栈的定义

  • 栈(Stack):只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是限定这种线性表只能在某一端进行插入和删除操作。
  • 栈顶(Top):线性表允许进行插入和删除的那一端。
  • 栈底(Bottom):固定的,不允许进行插入和删除的另一端。
  • 空栈:不含任何元素的空表。

1.2 栈的基本操作

  • InitStack(&S):初始化一个空栈 S。
  • StackEmpty(S):判断一个栈是否为空,若栈 S 为空返回 true,否则返回 false。
  • Push(&S,x):进栈,若栈 S 未满,将 x 加入使之成为新栈顶。
  • Pop(&S,&x):出栈,若栈 S 非空,弹出栈顶元素,并用 x 返回。
  • GetTop(S,&x):读栈顶元素,若栈顶元素为空,用 x 返回栈顶元素。
  • ClearStack(&S):销毁栈,并释放栈 S 占用的存储空间。

1.3 栈的顺序存储结构

  • 顺序栈的实现:栈的顺序存储称为顺序栈,是利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(Top)指示当前栈顶的位置。
  • 顺序栈的基本运算:初始化、判栈空、进栈、出栈、读栈顶元素。
  • 共享栈:利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数据空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延申。

1.4 栈的链式存储结构

  • 采用链式存储的栈成为链栈,链栈的优点是便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。
  • 通常采用单链表实现,并规定所有操作都是在单链表的表头进行。
  • 采用链式存储,便于结点的插入与删除。

二、队列

2.1 队列的定义

  • 队列简称队,是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队;删除元素称为出队或离队。
  • 操作特性为先进先出,又被称为先进先出的线性表。
  • 队头(Front):允许删除的一端,又称为队首。
  • 队尾(Rear):允许插入的一端。
  • 空队列:不含任何元素的空表。

2.2 队列的顺序存储结构

  • 队列的顺序存储:队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针 front 和 rear 分别指示队头元素和队尾元素的位置。
  • 初始条件(对空条件):Q.front == Q.rear == 0;
  • 进队操作:队不满时,先送值到队尾元素,再送队尾指针加 1。
  • 出队操作:队不空时,先取队头元素值,再将队头指针加 1。
  • 队空条件为:Q.rear == MaxSize ;

2.3 循环队列

  • 把存储队列元素的表从逻辑上看成一个环,当队首指针 Q.front = MaxSize-1后,再前进一个位置就自动到 0,可利用除法取余(%)来实现。
  • 初始时:Q.front = Q.rear = 0;
  • 队首指针进 1:Q.front = (Q.front+1)%MaxSize;
  • 队尾指针进 1:Q.rear = (Q.rear+1)%MaxSize;
  • 队列长度:(Q.rear+MaxSize-Q.front)%MaxSize;
  • 出队入队时:指针都按顺时针方向进 1;
  • 牺牲一个单元来区分队空和队满,入队少用一个队列单元,即队头指针在队尾指针的下一个位置作为队满的标志。
  • 队满条件为:(Q.rear+1)%MaxSize==Q.front。
  • 队空条件为:Q.front == Q.rear。
  • 队中元素的个数:(Q.rear-Q.front+MaxSize)%MaxSize
  • 类型中增设表示元素个数的数据成员
  • 队空:Q.size = 0;
  • 队满:Q.size = MaxSize;
  • 上述两种情况均有Q.front = Q.rear
  • 类型中增设 tag 数据成员,以区分是队空还是队满。
  • tag 等于零的情况下,若因删除导致Q.front == Q.rear 则为队空;
  • tag 等于 1 的情况下,若因插入导致Q.front == Q.rear 则为队满;
  • 循环队列的操作:初始化,判队空,入队,出队

2.4 队列的链式存储结构

  • 队列的链式表示称为链队列,是一个同时带有队头指针和队尾指针的单链表。
  • 头指针指向头节点,尾指针指向尾结点,即链表的最后一个结点。
  • 当 Q.front == NULL,且 Q.rear == NULL 时,链表队列为空。
  • 出队时,首先判断队是否为空,若不空,则取出队头元素,将其从链表中摘除,并让 Q.front 指向下一个结点(若该节点为最后一个节点,则置 Q.front 和 Q.rear 都为NULL)。
  • 入队时,建立一个新节点,将新节点插入到链表的尾部,并改让 Q.rear 指向这个新插入的结点(若原队列为空队,则令 Q.front 也指向该节点。
  • 用单链表表示的链式队列特别适合于数据元素变动比较大的情形,而且不存在队列满且产生溢出的问题。
  • 假如程序中要使用多个队列,于多个栈的情况一样,最好使用链式队列,这样就不会出现存储分配不合理和溢出的问题。
  • 链式队列的基本操作:初始化,判队空,入队,出队

2.5 双端队列

  • 双端队列是指允许两端都可以进行入队和出队操作大的队列,其元素的逻辑结构仍是线性,将队列的两端分别称为前端和后端,两边都可以入队和出队。
  • 在双端队列进队时:前端进的元素排列在队列中后端进的元素后面,后端进的元素排列在队列中前端元素进的元素的后面。
  • 在双端队列出队时:无论前端还是后端出队,先出的元素排在后出的元素前面。
  • 输出受限的双端队列:允许在一端进行插入和删除,但在另一端只允许插入的双端队列称为输出受限的双端队列。
  • 输入受限的双端队列:允许在一端进行插入和删除,但在另一端只允许删除的双端队列称为输入受限的双端队列。而如果限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻接的栈了。

三、栈和队列的应用

  • 栈在括号匹配中的应用
  • 栈在表达式求值中的应用
  • 栈在递归中的应用
  • 队列在层次遍历中的应用
  • 队列在计算机系统中的应用

四、特殊矩阵的压缩存储

  • 矩阵在计算机图形学、工程计算中占有举足轻重的地位,在数据结构中考虑的是如何用最小的内存空间来存储同样的一组数据。

4.1 数组

  • 数组和线性表的关系:数组是线性表的推广。一维数组可以看作是一个线性表,二维数组可以看作元素是线性表的线性表,以此类推。
  • 数组一旦被定义,它的维数和维界就不再改变,因此,除了结构的初始化和销毁之外,数组就只会有存取元素和修改元素的操作。

4.2 数组的存储结构

  • 一个数组的所有元素在内存中占用一端连续的存储空间。
  • 对于多维数组,有两种映射方法 :按行优先和按列优先。
  • 按行优先:先行后列,先存储行号较小的元素,行号相等先存储列号较小的元素。
  • 按列优先:先列后行。

4.3 矩阵的压缩存储

  • 压缩存储:指为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间,其目的是为了节省存储空间。
  • 特殊存储:指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵。常见的特殊矩阵有对称矩阵、上(下)三角矩阵、对角矩阵等。
  • 特殊矩阵的压缩存储方法:找出特殊矩阵中值相同的矩阵元素的分布规律,把那些呈现规律性分布的值相同的多个矩阵元素压缩存储到一个存储空间中。

4.4 稀疏矩阵

  • 矩阵元素个数 s 相对于矩阵中非零元素个数 t 来说非常多,即 s >> t 为的矩阵称为稀疏矩阵。
  • 将非零元素及其相应的行和列构成一个三元组(行标,列标,值),然后按照某种规律存储这些三元组。
  • 稀疏矩阵压缩存储后便失去了随机存取的特性。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容