数据结构与算法分析-线性表

线性表

考试内容

线性表的定义

线性表是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

顺序表的定义及其特点

线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素, 这种表示也称作线性表的顺序存储结构或顺序映像。通常,称这种存储结构的线性表为顺序表。

特点:逻辑上相邻的数据元素, 其物理次序也是相邻的。

链式表的定义及其特点

线性表链式存储结构的特点是:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)

线性表的应用

线性表的应用
有序表的合并


考试要求

掌握线性表的逻辑结构,以及基本操作

掌握用顺序存储结构对线性表基本操作的实现

掌握链式存储结构的实现技术,比如单向链表、双向链表、单循环链表、双向循环链表以及带头节点的链表

掌握链式存储结构对线性表基本操作的实现

具有在实际中选取不同存储结构的判断能力


栈和队列

考试内容

栈和队列的定义

栈(stack) 是限定仅在表尾进行插入或删除操作的线性表

队列

队列(queue)是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端删除元素

顺序栈和链式栈的定义及其特点;

顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。

链栈是指采用链式存储结构实现的栈。

顺序队列和链式队列的定义及其特点;

和顺序栈相类似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队
列头到队列尾的元素之外,尚需附设两个整型变最front 和rear 分别指示队列头元素及队列尾元素
的位置

链队是指采用链式存储结构实现的队列,通常链队用单链表来表示。一个链队显然需要两个分别指示队头和队尾的指针(分别称为头指针和尾指针)才能唯一确定。

栈和队列的应用

考试要求

栈、队列的逻辑结构,以及基本操作

掌握顺序存储结构对栈和队列基本操作的实现

掌握链式存储结构对栈和队列基本操作的实现

掌握顺序存储结构中实现循环队列的具体要求

img

队空:SQ.front=SQ.rear

队满:(SQ.rear+1) %Maxsize=SQ.front

循环队列入队, 队尾循环后移: SQ->rear =(SQ->rear+1)%Maxsize;
循环队列出队, 队首循环后移: SQ->front =(SQ->front+1)%Maxsize;

理解递归调用和栈之间的关系

程序中的“函数调用栈”是栈数据结构的栈的一种应用。
函数调用栈一般是从高地址向低地址增长的:
栈底为内存的高地址
栈顶为内存的低地址

因为程序中的栈结构是顺序栈,因此,如果递归的次数过多,程序中的数据过大,在不断的压栈过程中造成栈空间耗尽而产生栈溢出

栈溢出常由于函数递归过深或局部数组过大造成

栈保存了一个函数调用所需的维护信息:

  • 函数参数,函数返回地址
  • 局部变量
  • 函数调用上下文

掌握栈和队列的经典应用

数值转换

当将一个十进制整数N转换为八进制数时,在计算过程中,把N与8求余得到的八进制数
的各位依次进栈,计算完毕后将栈中的八进制数依次出栈输出,输出结果就是待求得的八进制数

  • 初始化一个空栈S。

  • 当十进制数N非零时, 循环执行以下操作:

    把N 与8 求余得到的八进制数压入栈S

    N更新为N与8的商

  • 当栈S 非空时, 循环执行以下操作

    弹出栈顶元素e

    输出e

括号匹配的检验

检验算法借助一个栈,每当读入一个左括号,则直接入栈,等待相匹配的同类右括号;每当读入一个右括号,若与当前栈顶的左括号类型相同, 则二者匹配, 将栈顶的左括号出栈, 直到表达式扫描完毕。
在处理过程中, 还要考虑括号不匹配出错的情况。例如, 当出现(( )[ ]))这种情况时, 由于前面入栈的左括号均已和后面出现的右括号相匹配, 栈已空,因此最后扫描的右括号不能得到匹配;出现[([ ])这种错误,当表达式扫描结束时,栈中还有一个左括号没有匹配;出现(()] 这种错误显然是栈顶的左括号和最后的右括号不匹配。

  • 初始化一个空栈S。

  • 设置一标记性变量flag, 用来标记匹配结果以控制循环及返回结果,1表示正确匹配,0表示错误匹配,flag初值为1。

  • 扫描表达式,依次读入字符ch, 如果表达式没有扫描完毕或flag 非零, 则循环执行以下操作:

    • 若ch 是左括号"[" 或"("’ 则将其压入栈

    • 若ch 是右括号")"’ 则根据当前栈顶元素的值分情况考虑:若栈非空且栈顶元素是"(" ,
      则正确匹配, 否则错误匹配, flag 置为0

    • 若ch 是右括号"]"’ 则根据当前栈顶元素的值分情况考虑:若栈非空且栈顶元素是"["’,则正确匹配, 否则错误匹配, flag 置为0.

  • 退出循环后, 如果栈空且flag 值为1’ 则匹配成功, 返回true, 否则返回false

表达式求值

为实现算符优先算法,可以使用两个工作栈,一个称做OPTR,用以寄存运算符;另一个称
作OPND, 用以寄存操作数或运算结果。

  • 初始化OPTR栈和OPND栈,将表达式起始符"#"压入OPTR栈。
  • 扫描表达式,读入第一个字符ch, 如果表达式没有扫描完毕至"#“或OPTR的栈顶元素
    不为”#"时,则循环执行以下操作:
    • 若ch不是运算符,则压入OPND栈,读入下一字符ch;
    • 若ch是运算符,则根据OPTR的栈顶元素和ch的优先级比较结果,做不同的处理:
      • 若是小于,则ch压入OPTR栈,读入下一字符ch;
      • 若是大于,则弹出OPTR栈顶的运算符,从OPND栈弹出两个数, 进行相应运算,
        结果压入OPND栈;
      • 若是等于,则OPTR的栈顶元素是“(” 且ch是")"'这时弹出OPTR栈顶的“)” ,
        相当千括号匹配成功,然后读入下一字符ch
  • OPND栈顶元素即为表达式求值结果,返回此元素。

版权声明:本文为weixin_45976751原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。