王道408数据结构——第三章 栈和队列

一、栈

栈(Stack)是只允许在一端进行插入或删除操作的线性表
栈顶:线性表允许插入删除的那一端
栈底:固定的、不允许进行插入删除的另一端
栈的操作特性可以概括为后进先出(LIFO)
n个不同的元素进栈,出栈元素不同的排列个数为C2nnn+1=1n!(2n)!n!1n+1=(2n)!n!(n+1)!\frac{C^n_{2n}}{n+1}=\frac{1}{n!}\frac{(2n)!}{n!}\frac{1}{n+1}=\frac{(2n)!}{n!(n+1)!}n+1C2nn=n!1n!(2n)!n+11=n!(n+1)!(2n)!(卡特兰数)

顺序栈

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

共享栈

利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。
共享栈是为了更有效地利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生上溢。

链栈

采用链式存储的栈称为链栈,优点是便于多个栈共享存储空间和提升效率,不存在栈满上溢的情况。通常采用单链表实现,规定所有操作在表头进行。

二、队列

队列(Queue)只允许在表的一段进行插入,而在表的另一端进行删除。
队头(Front):允许删除的一端。
队尾(Rear):允许插入的一端。
其特性概括为先进先出(FIFO)

队列的顺序储存

分配一块连续的存储单元存放队列中的元素,并设队头指针front(指向队头元素)和队尾指针rear(指向队尾元素下一个位置)

循环队列

将顺序队列臆造为一个环状的空间,即把存储队列元素的表从逻辑上视为一个环,称为循环队列,当队首指针Q.front = MAXSIZE - 1后,再前进一个位置就自动到0,可以利用取余运算。
队头指针front指向队头元素,队尾指针rear指向队尾元素的下一个指针。

初始时:Q.front = Q.rear = 0
队首指针进一(出队):Q.front = (Q.front + 1) % MAXSIZE
队尾指针进一(入队):Q.rear = (Q.rear + 1) % MAXSIZE
队列长度:(Q.rear + MAXSIZE - Q.front) % MAXSIZE
队空:Q.front == Q.fear
队满:(Q.rear + 1) % MAXSIZE == Q.front

队列的链式存储

队列的链式表示称为链队列,实际上是一个同时带有队头指针和队尾指针的单链表。
用单链表表示的链式队列特别适合于数据元素变动较大的情形,而且不存在队列满产生溢出的问题。

双端队列

指允许两端都进行入队出队操作的队列,其元素的逻辑结构仍是线性结构。

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

三、队列和栈的应用

括号匹配

算法如下
初始设置一个空栈,顺序读入括号:

  • 若是左括号,将其压入栈中;
  • 若是右括号,则将其与栈顶的括号进行匹配:
    • 若栈顶是类型相同的左括号,使其出栈
    • 若栈顶括号类型不匹配,则匹配不成功,退出程序

当括号序列读取完毕时,若栈空,则匹配成功,否则匹配不成功。

表达式求值

后缀表达式(逆波兰表达式)

后缀表达式的运算符在操作数的后面,在后缀表达式中已考虑了算符的优先级。后缀表达式只有操作数和算符,无需括号。
后缀表达式与表达式树的后序遍历序列相同。

算法如下
初始设置一个空栈,顺序读入后缀表达式的每一项,根据其类型决定操作:

  • 若为操作数:将其压入栈中
  • 若为运算符<op>:连续从栈中弹出两个操作数Y、X,进行X<op>Y运算,并将结果压入栈中

当表达式的所有项都处理完后,栈顶存放的就是最后的计算结果。

栈在递归中的应用

将递归算法转换为非递归算法,需要借助栈实现。
但对于单项递归和尾递归,可以用迭代的方式消除递归。
尾递归:程序中只有一句递归语句,且在末尾。
单向递归:指程序中的递归语句,在本程序操作执行前,都已经完成,如斐波那契数列。
这样一来,它们共同的特点是在化非递归时都没有非要保存的分支路线

队列在层次遍历中的应用

使用队列保存下一步的处理顺序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C和指针之const、#define、volatile

1、const 定义const 只读变量,具有不可变形 const int a = 100; 编译器通常不为普通Const只读变量分配存储空间, 而是将它们保存在符号表中, 这使得它成为一个编译期间的值,没有了存储与读内存操作,使用效率很高 #define M3 //宏常量const int N = 5; //此时并没有将…

dispatchTouchEvent onInterceptTouchEvent onTouchEvent区分

1. dispatchTouchEvent 是处理触摸事件分发,执行super.dispatchTouchEvent(ev)&#xff0c;事件向下分发。 2. onInterceptTouchEvent是ViewGroup提供的方法&#xff0c;默认返回false&#xff0c;返回true表示拦截。 3. onTouchEvent是View中提供的方法&#xff0c;ViewGroup也…

Avalonia跨平台入门第二十篇之语音播放问题

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表、聊天窗口、ListBox图片消息、窗口抖动、语音发送、语音播放;今晚加个班来解决…

递归算法浅谈

递归算法 程序调用自身的编程技巧称为递归&#xff08; recursion&#xff09;。   一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法&#xff0c;它通常把一个大型复杂的问题层层转化为一个与原问题类似的规模较小的问题来求解&#xff0c;递归策略仅仅需少量…

C和指针之实现strlen函数

1、问题 求字符串长度,实现strlen函数。 2、代码实现 #include <stdio.h> #include <assert.h>int get_strlen(char *str) {assert(NULL != str);return *str == \0 ? 0 : (1 + get_strlen(++str)); }int main() {char *str = "chenyu";char…

王道408数据结构——第四章 串(KMP算法)

一、串的定义和实现 字符串简称串&#xff0c;是由零个或多个字符组成的有限序列&#xff0c;一般记为S′a1a2⋅⋅⋅an′Sa_1a_2a_nS′a1​a2​⋅⋅⋅an′​&#xff0c;n称为串的长度。 串中任意多个连续字符组成的子序列称为该串的子串&#xff0c;相应的该串称为主串。某个…

ThoughtWorks技术雷达专区

作为一家服务于全球不同类型的IT专业服务公司&#xff0c;ThoughtWorks从未停止过对卓越技术的追求&#xff0c;为此&#xff0c;ThoughtWorks的全球技术委员会(TAB)会定期讨论技术战略&#xff0c;并将其绘制成一份能够体现技术趋势的雷达图&#xff0c;它相当于当下技术领域的…

腾讯视频VIP周卡深圳地区免费领!附非深圳免费领腾讯视频会员攻略

深圳今天开始&#xff0c;暂停了所有公共交通&#xff0c;小区开始封闭管理&#xff0c;大家都居家办公&#xff0c;腾讯官方今天给深圳地区用户免费发放7天腾讯视频VIP会员&#xff0c;居家期间&#xff0c;可以追剧了&#xff01;这是腾讯官方给深圳地区的抗疫福利&#xff0…

编译器与解释器

什么是编译器&#xff1f;什么事解释器&#xff1f; 编译器是女儿&#xff0c;解释器是儿子。为什么这么说呢&#xff1f; 引用文章 http://www.cnblogs.com/sword03/archive/2010/06/27/1766147.html 大概总结就是&#xff1a;妈给儿子和女儿打电话说&#xff1a;你们的老爸不…

SQL Server 权限的分类

SQL Server 的权限可以分三类 第一类 server 层面上的&#xff1a; select * from sys.fn_builtin_permissions(default) where class_desc like server; 第二类 database 层面&#xff1a; select * from sys.fn_builtin_permissions(default)    where class_desc like d…

C和指针之部分理解和编码总结

1、在C语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向成一个指向其首元素首地址的指针 这也就是为什么数组int a[10],a不能a++操作,而把a传递给函数的时候,可以作为指针a++操作的原因。 2、内存为0的地址处,也就是NULL地址处,一般定义指针变量的同时…

王道408数据结构——第五章 树与二叉树

文章目录一、树的基本概念树的性质二、二叉树满二叉树完全二叉树二叉排序树平衡二叉树二叉树的性质完全二叉树的性质三、二叉树的储存结构顺序储存链式存储四、树的储存方式双亲表示法孩子表示法孩子兄弟表示法&#xff08;二叉树表示法&#xff09;五、二叉树的遍历先序遍历&a…

Redis集群监控RedisClusterManager

Redis集群监控RedisClusterManagerRedisClusterManager监控Redis集群1234环境要求&#xff1a;Java8jdk配置这里略过RedisClusterManager 下载地址&#xff1a;https://git.oschina.net/yanfanVIP/RedisClusterManager/releases1234567891011121314151617181920212223242526272…

Visual Studio怎么使用中文帮助文档

今天给大家带来vs中怎么使用帮助文档&#xff1f;事情起因是这样的&#xff0c;上周有个哥们问我问题&#xff0c;字符串怎么分割啊&#xff0c;我当时有点忙&#xff0c;我就说你去看看帮助文档。然后过了三十秒 我看见他打开了百度。。。。。。我郁闷了 &#xff0c;我说你直…

C和指针之函数之在数组中找特定元素并返回指向该位置的指针

1、问题 在数组中找特定元素并返回指向该位置的指针2、代码实现 #include <stdio.h> #include <stdlib.h>//数组中找特定元素并返回指向该位置的指针 int *find_int(int key, int array[], int array_len) {int i;for (i 0; i < array_len; i){if (array[i] k…

逻辑推理题

25匹马找前3名或者前5名&#xff0c;最少用几次&#xff1f; 火车站集合&#xff0c;最后一个人几点到&#xff1f;转载于:https://www.cnblogs.com/kira2will/p/4058223.html

sublime快捷键收藏

快速查找&#xff08;ctrl P&#xff09;输入函数名可以快速找到函数。输入#文本可以快速进行文件内文本匹配。3. 多行游标功能&#xff08;ctrl D&#xff0c;非常实用&#xff09;如何将文件中的某个单词更改为另一个&#xff1f;方法一&#xff1a;利用查找替换功能&#…

C和指针之函数之归以字符形式按顺序打印数字的每位数字(递归和非递归)

1、问题 以字符形式按顺序打印数字的每位数字(递归和非递) 2、代码实现 #include <stdio.h> #include <math.h> //以字符形式按顺序打印数字的每位数字,比如4267,打印4267 //递归实现void printf_char(unsigned int value) {unsigned int tmp;tmp = value / 10;…

王道408数据结构——第六章 图

文章目录一、图的基本概念二、图的储存邻接矩阵邻接表十字链表邻接多重表三、图的基本操作四、图的遍历广度优先搜索&#xff08;BFS&#xff09;深度优先搜索&#xff08;DFS&#xff09;图的遍历和图的连通性五、最小生成树Prim算法Kruskal算法六、最短路径Dijkstra求单源最短…

使用 python 的 urllib2和 urllib模块爆破 form 表单的简易脚本

python 的 http 中 urllib2和 urllib模块在web 表单爆破的使用方法脚本中还增加了 urllib2和 urllib模块如何添加代理的方法# -*- coding: utf-8 -*- import urllib2 import urllib import timedef brute_force(user, password):#strip() 方法用于移除字符串头尾指定的字符&…