精华内容
下载资源
问答
  • 顺序存储结构优点和缺点

    千次阅读 2020-07-22 20:09:09
    顺序存储结构优点和缺点 优点: 1.无需为表示结点间的逻辑关系而增加额外的存储空间; 2.可方便地随机存取表中的任一元素。 缺点: 1.插入或删除运算不方便,除表尾的位置外,在表的其它位置上进行插入或...

    顺序存储结构的优点和缺点

    优点:

    1.无需为表示结点间的逻辑关系而增加额外的存储空间;

    2.可方便地随机存取表中的任一元素。

    缺点:

    1.插入或删除运算不方便,除表尾的位置外,在表的其它位置上进行插入或删除操作都必须移动大量的结点,其效率较低;

    2.由于顺序表要求占用连续的存储空间,存储分配只能预先进行静态分配。因此当表长变化较大时,难以确定合适的存储规模。

    展开全文
  • 二叉树的顺序存储结构

    千次阅读 2021-02-05 10:01:58
    一、顺序存储结构 二叉树的顺序存储结构是指用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为 i 的结点元素存储在一维数组下标为 i-1 的分量中。 依据二叉树的...

    一、顺序存储结构

    二叉树的顺序存储结构是指用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为 i 的结点元素存储在一维数组下标为 i-1 的分量中。

    依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映结点之间的逻辑关系,这样既能最大地节省存储了空间,又能利用数组元素的下标值确定结点在二叉树中的位置,以及结点之间的关系。

    从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树可以转换成数组。

    二、顺序存储二叉树的特点

    1、顺序二叉树通常只考虑完全二叉树和满二叉树
    2、 第n个元素的左子结点为 2 * n + 1
    3、第n个元素的右子结点为 2 * n + 2
    4、 第n个元素的父结点为 (n-1) / 2
    n表示二叉树中的第几个元素,按0开始编号

    在这里插入图片描述
    例如,第一个元素2的左子结点为 21+1=3,即为第三个元素4;右子结点为 21+2=4,即为第四个元素5;父结点为(1-1) / 2=0,即为第零个元素1。

    三、遍历顺序存储二叉树

    package Tree;
    
    public class ArrayBinaryTree {
    
    	public static void main(String[] args) {
    		int[] arr= {1,2,3,4,5,6,7};
    		ArrBinaryTree arrBinaryTree=new ArrBinaryTree(arr);
    		System.out.println("顺序存储二叉树的前序遍历");
    		arrBinaryTree.preOrder(0);
    		System.out.println();
    		System.out.println("顺序存储二叉树的中序遍历");
    		arrBinaryTree.inOrder(0);
    		System.out.println();
    		System.out.println("顺序存储二叉树的后序遍历");
    		arrBinaryTree.postOrder(0);
    		System.out.println();
    
    	}
    }
    
    class ArrBinaryTree{
    	int[] arr;//用于存储数据结点的数组
    	
    	public ArrBinaryTree(int[] arr) {//ArrBinaryTree构造函数
    		this.arr=arr;
    	}
    	
    	//顺序存储二叉树的前序遍历(根->左->右)
    	public void preOrder(int index) {
    		if(arr==null||arr.length==0) {//如果数组为空,或者数组长度为零无法遍历
    			System.out.println("数组为空,不能执行二叉树的前序遍历");
    		}
    		
    		System.out.printf(arr[index]+" ");//打印当前结点
    		if((index*2+1)<arr.length) {//当前结点的左子结点没有越界则向左递归前序遍历
    			preOrder(index*2+1);
    		}
    		if((index*2+2<arr.length)) {//当前结点的右子结点没有越界则向右递归前序遍历
    			preOrder(index*2+2);
    		}
    	}
    	//顺序存储二叉树的中序遍历(左->根->右)
    	public void inOrder(int index) {
    		if(arr==null||arr.length==0) {//如果数组为空,或者数组长度为零无法遍历
    			System.out.println("数组为空,不能执行二叉树的中序遍历");
    		}
    		
    		if((index*2+1)<arr.length) {//当前结点的左子结点没有越界则向左递归前序遍历
    			preOrder(index*2+1);
    		}
    		System.out.printf(arr[index]+" ");//打印当前结点
    		if((index*2+2<arr.length)) {//当前结点的右子结点没有越界则向右递归前序遍历
    			preOrder(index*2+2);
    		}
    	}
    	
    	// 顺序存储二叉树的后序遍历(左->右->根)
    	public void postOrder(int index) {
    		if(arr==null||arr.length==0) {//如果数组为空,或者数组长度为零无法遍历
    			System.out.println("数组为空,不能执行二叉树的中序遍历");
    		}
    		
    		if((index*2+1)<arr.length) {//当前结点的左子结点没有越界则向左递归前序遍历
    			preOrder(index*2+1);
    		}
    		if((index*2+2<arr.length)) {//当前结点的右子结点没有越界则向右递归前序遍历
    			preOrder(index*2+2);
    		}
    		System.out.printf(arr[index]+" ");//打印当前结点
    	}
    }
    

    运行结果:

    顺序存储二叉树的前序遍历
    1 2 4 5 3 6 7 
    顺序存储二叉树的中序遍历
    2 4 5 1 3 6 7 
    顺序存储二叉树的后序遍历
    2 4 5 3 6 7 1 
    
    展开全文
  • 数据结构(16)队列的顺序存储结构

    千次阅读 2020-05-27 14:07:47
    1、队列的顺序存储 队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针:队头指针front指向队头元素。队尾指针rear指向队尾元素的下一个位置(其实和单链表有无头结点是一样的,队尾指针你...

    目录

    1、队列的顺序存储

    2、循环队列

    3、循环队列的操作

    3.1、初始化

    3.2、判队空

    3.3、入队

    3.4、出队


    1、队列的顺序存储

    队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针:队头指针front指向队头元素。队尾指针rear指向队尾元素的下一个位置(其实和单链表有无头结点是一样的,队尾指针你想指向最后一个元素或者最后一个元素的下一位都行,注意相应的操作随之变动就行)。

    队列的顺序存储可描述为

    #define MaxSize 50
    typedef struct
    {
        ElemType data[MaxSize];
        int front,rear;
    }SqQueue;

    初始状态(队空条件):Q.front == Q,rear == 0。

    进队操作:队不满时,先送值到队尾元素,再将队尾指针加1。

    出队操作:队不空时,先去队头元素值,再将队头指针加1。

                                                            图16.1  队列的操作

    图16.1(a)所示为队列的初始状态,有Q.front == Q.front == 0成立,该条件可以作为队列判空的条件。但能否用Q.rear == MaxSize作为队列满的条件呢? 显然不能,图3.6(d)中,队列中仅有一个元素,但仍然满足该条件,这时对垒出现“上溢出”,但这种溢出并不是真正的溢出,在data数组中仍然存在可以存放元素的空位置,所以这是一种“假溢出”。

    2、循环队列

    前面已经指出了顺序队列的缺点,为了解决顺序队列的“假溢出”也就是空间只能用一次,严重浪费的问题,我们引出一个循环队列的概念。

    循环队列就是将顺序队列臆造为一个环状的空间,即把存储队列元素的表从逻辑上视为一个环(用链表来的指针来向下会清晰很多),称为循环队列。当队首指针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。

                                                          图16.2  循环队列出入队示意图

    根据我们前面所述,队空的时候:Q.front = Q.rear;那这样的话考虑一下队满的时候咋表示,顺着思路走,位指针要指向队尾的下一个,那不就是:Q.rear = Q.front 。这样不就队空队满无法区分了吗?

    为了区分队空队满的情况,有以下三种处理方式:

    1. 牺牲一个单元来区分队空还是队满,如队时少用一个队列单元,约定以“队头指针在队尾指针的下一位置作为队满的标志”。如图16.2(d)所示。

      队满:(Q.rear+1)%MaxSize  == Q.front;

      队空:Q.front == Q.rear。

      队列中元素个数:(Q.rear - Q.front + MaxSize)%MaxSize。

    2. 类型中增设一个数据成员,专门记录队列中元素的个数。
    3. 类型中增设tag数据成员,以区分是队满还是队空。tag等于0时,若因删除导致Q.front == Q.rear,则为队空;tag等于1时,若因插入导致Q.front == Q.rear,则为队满。

    3、循环队列的操作

    3.1、初始化

    void InitQueue(SqQueue &Q)
    {
        Q.rear = Q.front = 0;
    }

    3.2、判队空

    bool isEmpty(SqQueue Q)
    {
        if(Q.rear == Q.front)
            return true;
        return false;
    }

    3.3、入队

    bool EnQueue(SqQueue &Q,ElemType x)
    {
        if((Q.rear+1)%MaxSize == Q.front)
            return false;
        Q.data[Q.rear] = max;
        Q.rear = (Q.rear+1)%MaxSize;
        returrn true;
    }

    3.4、出队

    bool DeQueue(SqQueue &Q,ElemType x)
    {
        if(Q.rear == Q.front)
            return false;
        x = Q.data[Q.front];
        Q.front= (Q.front+1)%MaxSize;
        returrn true;
    }

     

     

     

     

    你,总要埋头去做一些事情,不是吗

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 顺序存储结构和链式存储结构的优缺点比较

    万次阅读 多人点赞 2018-10-09 17:45:34
    顺序存储结构和链式存储结构的比较 优缺点 顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。 优点:存储密度大(=1),存储空间利用率高。 缺点:...

    顺序存储结构和链式存储结构的比较

    优缺点

    1. 顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。
      • 优点:存储密度大(=1),存储空间利用率高。
      • 缺点:插入或删除元素时不方便。
    2. 链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针
      • 优点:插入或删除元素时很方便,使用灵活。
      • 缺点:存储密度小(<1),存储空间利用率低。

    使用情况

    • 顺序表适宜于做查找这样的静态操作;
    • 链表宜于做插入、删除这样的动态操作。
    • 若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;
    • 若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。

    比较

    顺序表与链表的比较

    • 基于空间的比较

      • 存储分配的方式
        • 顺序表的存储空间是静态分配的
        • 链表的存储空间是动态分配的
      • 存储密度 = 结点数据本身所占的存储量/结点结构所占的存储总量
        • 顺序表的存储密度 = 1
        • 链表的存储密度 < 1
    • 基于时间的比较

      • 存取方式
        • 顺序表可以随机存取,也可以顺序存取
        • 链表是顺序存取的
      • 插入/删除时移动元素个数
        • 顺序表平均需要移动近一半元素
        • 链表不需要移动元素,只需要修改指针

     

    内容转载自:https://blog.csdn.net/VonSdite/article/details/78240594?locationNum=9&fps=1

    展开全文
  • 顺序存储结构定义与特点 定义 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。 基地址(首地址,起始位置):线性表的第1个数据元素a1a_1a1​的存储位置。 特点 地址连续 例如, ...
  • 线性表的顺序存储结构

    千次阅读 2016-10-10 21:52:54
    说这么多的线性表,我们来看看线性表的两种物理结构的第一种——顺序存储结构。 线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。 线性表(a1,a2,......,an)的顺序存储示意图...
  • 线性表的顺序存储结构(C语言实现)

    千次阅读 多人点赞 2019-09-02 17:09:44
    线性表的顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素 #include "stdio.h" #define MAXSIZE 20 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Statu...
  • 树的顺序存储结构

    2021-04-21 21:15:59
    一、双亲表示法(顺序存储) 二、孩子表示法(顺序+链式存储) 三、孩子兄弟表示法(链式存储) 四、二叉树转换为树 五、森林和二叉树的转换 六、小结 下一篇: 一、双亲表示法(顺序存储) 实现: #...
  • 线性表之顺序存储结构和链式存储结构

    万次阅读 多人点赞 2018-09-28 14:17:06
    顺序存储结构和链式存储结构有所不同,具体区别如下表所示: 通过上面的对比,可以得出一些经验性的结论: 若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。若需要频繁插入和删除时,宜...
  • 顺序存储结构和链式存储结构的优缺点

    万次阅读 多人点赞 2016-07-13 21:10:31
    (一)顺序存储结构和链式存储结构的优缺点比较,以及使用情况。 1 优缺点 ① 顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。 优点:存储密度大...
  • 顺序存储结构

    万次阅读 2018-02-01 18:41:59
    2. 顺序存储结构 答:线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。     3. 顺序存储结构需要三个属性: ■ 存储空间的起始位置:数组data,它的存储位置就是存储空间...
  • 3.线性表的顺序存储结构-------顺序表 顺序表是把线性表中的所有元素按照其逻辑顺序依次存储在计算机存储器中指定存储位置开始的一块连续的存储空间中。 4.线性表的链式存储结构-------链表...
  • 顺序存储结构就是用一组地址连续的存储单元依次存储该线性表中的各个元素。由于表中各个元素具有相同的属性,所以占用的存储空间相同。 线性表按链式存储时,每个数据元素 (结点)的存储包括数据区和指针区两个部分...
  • 线性表的顺序存储结构及实现

    千次阅读 2020-11-21 01:21:21
    线性表的顺序存储结构定义 线性表的介绍 线性表的顺序存储称为顺序表(sequential list),其基本思zhunc想是用一段地址连续存储单元的存循单元依次存储线性表的数据元素,则第,如图1所示。设顺序表的每个元素占用c...
  • 顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配。 它的优点:  (1)方法简单,各种高级语言中都有数组,容易实现。  (2)不用为表示节点间的逻辑关系而增加...
  • 线性表的顺序存储结构 定义: 指的是用一段地址连续的存储单元依次存储线性表的数据元素. 优点: 无需为表示表中元素之间逻辑关系而增加额外存储空间 可快速存取表中任意一个位置的元素值 缺点: 插入和删除需要移动...
  • 二、栈的顺序存储结构 2.1 顺序栈的实现   采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针 (top) 指示当前栈顶元素的位置。   栈的顺序结构定义如下...
  • 顺序存储结构用一段连续的存储单元依次存储线性表的数据元素 单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素 时间性能 查找 顺序存储结构O(1) 单链表O(n) 插入和删除 顺序存储...
  • C++线性表的顺序存储结构       线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。 ...
  • 线性表的顺序存储结构特点优点: *无序为表示表中元素之间的逻辑关系而增加额外的存储空间 *可以快速地存取表中任一位置的元素 缺点: *插入和删除操作需要移动大量元素 *当线性表长度变化较大时,...
  • 顺序存储结构优点: 1)随机存取(时间复杂度为O(1)); 2)无需为表示表中元素之间的逻辑关系而增加额外的存储空间; 缺点: 1)插入、删除操作需要移动大量元素,效率低(时间复杂度为O(n)); 2)表的长度...
  • 线性表是一个有序序列,若元素存在多个,则第一...线性表有两种物理结构,第一种为顺序存储结构,另一种为链式存储结构。这一章先来利用C++实现顺序存储结构。 头文件声明lineartable.h #pragma once /* 线性...
  • 栈(stack)很多人都不会太陌生,说到栈大家一定会想到一句... 下面首先说说栈的顺序存储结构。即用一个StackSize大小的数组来存储整个栈,那么下标为0的元素就是栈底元素,用top变量来指示栈顶元素,因为数组的大小...
  • 那么这一篇博客我们就来说说线性表的两种物理结构中的第一种—顺序存储结构。 一、顺序存储定义 线性表的顺序存储结构指的是用一段地址连续的存储单元依次线性表的数据元素。顺序存储的示意图如下: 二、线性表的...
  • 我们知道,顺序存储结构(顺序表)的底层实现用的是数组,根据创建方式的不同,数组又可分为静态数组和动态数组,因此顺序存储结构的具体实现其实有两种方式。 通常所说的数组都指的是静态数组,如 str[10],静态...
  • 1.顺序存储结构特点: 线性表的逻辑结构与存储结构一致。用数据元素的存储位置标示相邻数据元素之间的前后关系。 可以对数据元素进行随机储存。访问线性表时,可以利用上述给出的数学公式,快速地计算出任何一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 308,909
精华内容 123,563
关键字:

顺序存储结构的优点