数据结构-王道2017-第3章 栈和队列-栈和队列的应用

1.前中后缀表达式的转换:

举例说明将自然表达式转换成二叉树:

a×(b+c)-d

① 根据表达式的优先级顺序,首先计算(b+c),形成二叉树

②然后是a×(b+c),在写时注意左右的位置关系

③最后在右边加上 -d

然后最这个构造好的二叉树进行遍历,三种遍历的顺序分别是这样的:

① 前序遍历:根-左-右

② 中序遍历:左-根-右

③ 后序遍历:左-右-根

前缀表达式:-*a+bcd

中缀表达式:a*b+c-d

后缀表达式:abc+*d-

2.队列在层次遍历二叉树中起作用,且在计算机系统中应用非常广泛:

1)解决主机与外部设备之间速度不匹配的问题

主机与打印机之间,不能直接把输出的数据送给打印机打印,设置一个打印数据缓冲区

2)解决由多用户引起的资源竞争问题

CPU资源竞争问题,把请求在时间上的先后顺序,排成一个队列,每次把CPU分配给队首请求的用户使用。

3.栈的应用有:递归,进制转换,迷宫求解

后缀表达式中,每一个计算符号均位于它两个操作数的直接后面,按照这样的方式逐步根据计算的优先级将每个计算式进行变换

调用函数时,系统会为调用者构造一个由参数表和返回地址组成的活动记录,并将记录压入系统提供的栈中,若被调用函数有局部变量,也要压入栈中。

利用栈可以模拟递归的过程,以此来消除递归,但对于单向递归和尾递归而言,可以用迭代的方式消除递归。

   尾递归就是把当前的运算结果(或路径)放在参数里传给下层函数,函数内部调用函数时,直接接受参数进行运算,因此不需要在此基础上,计算机内部再次开辟内存求未知量 普通递归

采用尾递归实现Fibonacci函数,程序如下所示:

int FibonacciTailRecursive(int n,int ret1,int ret2)
{
   if(n==0)
      return ret1;
    return FibonacciTailRecursive(n-1,ret2,ret1+ret2);
}

单向递归:指程序中的递归语句,在本程序操作执行前,都已经完成

4. 特殊矩阵的压缩存储

矩阵在数据结构中考虑的是如何用最小的内存空间来存储同样的一组数据

数组是由n(n>=1)个相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每个元素受n个线性关系的约束,每个元素在n个线性关系中的序号称为该元素的下标,并称该数组为n维数组。

数组与线性表的关系:数组是线性表的推广。一维数组可以看作是一个线性表;二维数组可以看作是线性表的线性表。数组一旦被定义,它的维数和维界就不再改变

5.数组的存储结构

一个数组的所有元素在内存中占用一段连续的存储空间

LOC(ai) = LOC(ai) + i * L(0<=i<n)   L是每个数组元素所占存储单元

6.对于多维数组有两种映射方法:按行优先(先存储行号较小的元素)和按列优先。

矩阵的压缩存储:多个值相同的元素只分配一个存储空间,对零元素不分配存储空间,目的是为了节约存储空间

常见的特殊矩阵有:对称矩阵、上下三角矩阵、对角矩阵等

特殊矩阵的压缩存储方法:找出矩阵中值相同的矩阵元素的分布规律,把那些呈现规律性分布的值相同的多个矩阵元素压缩到一个存储空间中

1)将对称矩阵存放在一维数组B[n(n+1)/2]中,只存放主对角线和下三角区的元素。

根据a(i,j)前面的元素个数,计算a[i,j]在B中的下标

k=i(i-1)/2 + j - 1;   i>=j;(下三角区和主对角线元素)

k=j(j-1)/2 + i-1;       i<j;  (上三角元素aij = aji)

时间: 2024-09-30 04:03:00

数据结构-王道2017-第3章 栈和队列-栈和队列的应用的相关文章

数据结构期末复习第三章栈和队列

第三章:栈和队列 栈的特性:后进先出(LIFO) 1.  输入序列为ABC,可以变为CBA时,经过的栈操作为( B )A. push, pop, push, pop, push, popB. push, push, push, pop, pop, popC. push, push, pop, pop, push, popD. push, pop, push, push, pop, pop 解析: ABC经过push,push,push操作后,从栈顶到栈底元素为CBA,经过pop,pop,pop出

数据结构复习【第三章】 栈

(1)掌握栈的相关概念.特点和基本操作(入栈.出栈.判栈空.获取栈元素等). 栈:限制只能在表的一端进行插入和删除的线性表. 允许插入和删除的一端,称为栈顶(top). 不允许插入和删除的另一端,称为栈底(bottom). 把一个元素从栈顶放入栈中的操作,称为进栈.入栈或压栈 (push) 从栈顶取出一个元素的操作称为出栈或弹出(pop). 特点:后进先出 (2)掌握顺序栈.链栈.共享栈的实现. 顺序栈: 基本操作: 创建: { base = new T[m]: if (base = = NUL

数据结构与算法分析-第3章

.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top: 0 } .todo { font-family: monospace; color: red } .done { font-family: monospace; color: green } .priority { font-fami

第三章:1.栈和队列 -- 栈的表示及实现

前言: 栈和队列 是两种重要的线性结构.从数据结构角度来看,栈和队列也是线性表,它的特殊性在于其操作是线性表的子集,是操作受限的线性表,因此可以称作限定性的数据结构. (限定性:如.人为的规定线性表只能从表尾插入和删除结点数据元素,那么这样的线性表就是栈) 目录: 1.栈 2.栈的应用举例 3.栈与递归的实现 4.队列 5.离散事件模型 正文: 栈的定义 栈(stack) 如上所说,就是限定只能在表尾进行插入和删除的线性表.表尾 称为 栈顶(top), 表头 称为 栈底 (bottom),没有数

数据结构期末复习第五章数组和广义表

数据结构期末复习第五章 数组和广义表 二维数组A[m][n]按行优先 寻址计算方法,每个数组元素占据d 个地址单元.     设数组的基址为LOC(a11) :LOC(aij)=LOC(a11)+((i-1)*n+j-1)*d     设数组的基址为LOC(a00) :LOC(aij)=LOC(a00)+( i*n+j )*d    二维数组A[m][n]按列优先 寻址计算方法,每个数组元素占据d 个地址单元.     设数组的基址为LOC(a11) :LOC(aij)=LOC(a11)+((j

数据结构回顾之顺序存储结构中的线性表(栈与队列顺序线性表实现)

说到数据结构呢,对于一个Coder来说还是蛮重要的啦,每次看数据结构的东西都有新的收获,这两天在回顾数据结构的知识.当然啦,虽然数据结构有些是理论的东西,如果好好的理解数据结构的东西还是少不了的代码的支撑的.数据结构简单的来说吧,可以分为两大类,一个是数据的"物理存储结构",另一种是数据的"逻辑存储结构".数据的"物理存储结构"又可分为顺序的和链式的(下面将会结合着代码打印内存地址的形式来观察物理存储结构). 逻辑存储结构又可分为集合,线性, 树

【数据结构之旅】顺序栈的定义、初始化、空栈判断、入栈、出栈操作

说明: 往前学习数据结构,想运行一个完整的顺序栈的程序都运行不了,因为书上给的都是一部分一部分的算法,并没有提供一个完整可运行的程序,听了实验课,自己折腾了一下,总算可以写一个比较完整的顺序栈操作的小程序,对于栈也慢慢开始有了感觉.下面我会把整个程序拆开来做说明,只要把这些代码放在一个文件中,用编译器就可以直接编译运行了. 一.实现 1.程序功能 关于栈操作的经典程序,首当要提及进制数转换的问题,利用栈的操作,就可以十分快速地完成数的进制转换. 2.预定义.头文件导入和类型别名 代码如下: #i

【数据结构】用C++编写栈及基本操作(包括入栈,出栈,获得栈顶,摧毁,清空等等)

//[数据结构]用C++编写栈及基本操作(包括入栈,出栈,获得栈顶,摧毁,清空等等) //头文件 #ifndef _SEQ_STACK_ #define _SEQ_STACK_ #include <iostream> using namespace std; template <class Type> class SeqStack { public: SeqStack(size_t sz=INIT_SIZE) { capacity = sz > INIT_SIZE ? sz

数据结构——线性表(第二章)

一.基本概念 1.线性表:简称表,是n(n>=0)个具有相同类型的数据元素的有限序列,线性表中数据元素的个数称为线性表的长度.长度为零时称为空表. 2.线性表的顺序存储结构称为顺序表. 3.单链表:单链表是一组任意的存储单元存放线性表的位置,这组存储单元可以连续也可以不连续,甚至可以零散分布在内存中的任意位置. 下面着重介绍有关单链表的操作: #include<iostream> using namespace std; const int maxsize = 10; // 定义单链表的

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &