三、栈和队列和数组

考察形式

通常选择题

知识框架

(一)栈和队列的基本概念

(二)栈和队列的顺序存储结构

(三)栈和队列的链式存储结构

(四)多维数组的存储

(五)特殊矩阵的压缩存储

特殊矩阵

(2)三角阵

上三角阵
为矩阵下三角部分(不包括对角线)元素全为c(c可为0)的矩阵。
下三角阵
为矩阵上三角部分(不包括对角线)元素全为c(c可为0)的矩阵。
下三角矩阵
在这里插入图片描述
见图3.23(a)中,
上三角区的所有元素均为同一常量。
其存储思想与对称矩阵类似
存储完下三角区和主对角线上的元素之后,紧接着存储对角线上方的常量一次,
故可以将下三角矩阵A[1…n][1…n]压缩存储在B[n(n+1)/2+1]中。
在这里插入图片描述在这里插入图片描述

2.稀疏矩阵

稀疏矩阵的存储

(1)稀疏矩阵的顺序存储及相关操作
常用的稀疏矩阵顺序存储方法有三元组表示法伪地址表示法
(2)稀疏矩阵的链式存储及相关操作
在稀疏矩阵的链式存储方法中,最常用的有两种:邻接表表示法十字链表表示法

(六)栈、 队列和数组的应用

栈的应用

中缀转后缀表达式

算法思想如下:

  1. 从左向右开始扫描中缀表达式;
  2. 遇到数字时,直接加入后缀表达式;
  3. 遇到运算符时:abc规则
  • a.若为左括号’(’,入栈;
  • b.若为右括号’)’,则依次把栈中的运算符加入后缀表达式,直到出现左括号’(’,并从栈中删除左括号’(’;
  • c.若为除括号外的其他运算符("+"、"-"、"*"、"/"),
    c.1栈空,入栈
    c.2栈顶元素为’(’,入栈
    c.3当其优先级高于除’(‘外的栈顶运算符时,直接入栈。
    c.4否则从栈顶开始,依次弹出比当前处理的运算符优先级和优先级相等的运算符,直到一个比它优先级低的或遇到了一个左括号’('为止。
  1. 扫描的中缀表达式结束时,栈中的所有运算符依次出栈加入后缀表达式。
    在这里插入图片描述在这里插入图片描述

栈在递归中的应用

递归是一种重要的程序设计方法。
简单地说,若在一个函数、过程或数据结构的定义中又应用了它自身,则这个函数、过程或数据结构称为是递归定义的,简称递归。
它通常把一个大型的复杂问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的代码就可以描述出解题过程所需要的多次重复计算,大大减少了程序的代码量。
但在通常情况下,它的效率并不是太高。

栈题

【408-2009】入栈顺序,出栈立即进入队列,出队顺序,得栈的容量
【408-2010】进栈顺序,限制连续退栈次数,不可能得到的出栈顺序
【408-2011】进栈顺序,直到所有元素出栈,得出栈序列中特定开头元素序列个数
【408-2012】中缀转后缀表达式
在这里插入图片描述

【408-2013】入栈序列,确定出栈序列中第2元素,得出栈序列中第3元素取值个数,即特定序列个数
【408-2014】中缀转后缀表达式
在这里插入图片描述在这里插入图片描述

手工直接求前缀或后缀表达式:

在这里插入图片描述

【408-2015】递归调用函数时,栈的使用
系统栈中保存的函数信息满足先进后出

int S(int n)
{return (n<=0)?0:s(n-1)+n;}
void main()
{cout<<S(1);}
程序运行时使用栈来保存调用过程的信息,自栈底到栈顶保存信息依次是

? : 条件表达式
如果条件为真 ? 则值为 X : 否则值为 Y

/* 三元运算符实例 */
   a = 10;
   b = (a == 1) ? 20: 30;
   printf( "b 的值是 %d\n", b );
 
   b = (a == 10) ? 20: 30;
   printf( "b 的值是 %d\n", b );
  
   ①b 的值是 30
   ②b 的值是 20

 cout << "Hello World";//会在屏幕上显示消息 "Hello World"

main()→S(1)→S(0)
【408-2016】考了队列
【408-2017】栈的概念:
栈的定义、基本操作
何时使用,有何作用
入栈次序和出栈次序关系,
【408-2018】两个栈,操作数、运算符,实现函数F,栈顶保存结果

【408-2019】
【408-2020】

队列的应用

队列题

【408-2009】逻辑结构-队列,应用场景
为解决计算机主机与打印机之间速度不匹配的问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是()。
【408-2010】双端队列
两端入队,一端出队,依次入队后再进行出队,则不可能的出队序列
输出受限队列=栈
根据出队顺序得入栈顺序,再对照入队顺序是否可能实现
【408-2011】循环队列
初始指针位置:front=rear=0,
入队时操作,插入操作只改变队尾指针
1.判断队满:size= =Maxsize
即(rear+1)%Maxsize= =front
2.队尾指针加1取模:rear=(rear+1)%Maxsize
出队时操作,插入操作只改变队首指针
【408-2012】
【408-2013】
【408-2014】循环队列
队空条件:front=rear//不论队首、队尾指针指向数组中的哪个位置,只要两者重合,即为队空
队满条件:front=(rear+1)%Maxsize即利用除法取余运算实现当队首指针front=Maxsize-1后再前进一个位置就自动到0
Maxsize:数组容纳最大元素个数,数组下标0开始
注意:A[0…M-1]→Maxsize=M

【408-2015】
【408-2016】设有下图所示的火车车轨,入口到出口之间有n条轨道,列车的行进方向均为从左至右,列车可驶入任意一条轨道。现有编号为1~9的9列列车,驶入的次序依次是8,4,2,5,3,9,1,6,7。若期望驶出的次序依次为1-9,则n至少是。
在这里插入图片描述
多个队列问题,队列先进先出原则

761935248入口出口 123456789
98
54
32
761

【408-2017】
【408-2018】队列和栈,入队顺序,出队后输出,出队后入栈,入栈后输出,三种操作组合得输出序列

数组的应用

【408-2016】
在这里插入图片描述

【408-2017】
在这里插入图片描述

【408-2018】
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值