数组、链表、堆栈和队列

转载 2015年07月10日 14:50:29

转载:http://blog.csdn.net/amork/article/details/7258216


数据存储结构

它是计算机的一个概念,简单讲,就是描述数据在计算机中存储方式的学科;常用的数据存储方式就两种:顺序存储,非顺序存储!顺序存储就是把数据存储在一块连续的存储介质(比如硬盘或内存)上—-举个例子:从内存中拿出第100个字节到1000个字节间的连续位置,存储数据;数组就是典型的顺序存储!非顺序存储就是各个数据不一定存在一个连续的位置上,只要每个数据知道它前面的数据和后面的数据,就能把所有数据连续起来啦;链表就是典型的非顺序存储啦!

数据结构

是指相互之间存在一种或多种特定关系的数据元素的集合。听起来是不是很抽象,简单理解:数据结构就是描述对象间逻辑关系的学科。比如:队列就是一种先进先出的逻辑结构,栈是一种先进后出的逻辑结构,家谱是一种树形的逻辑结构!

数组、链表、堆栈和队列是最基本的数据结构,任何程序都会涉及到其中的一种或多种。

数组

数组是最最基本的数据结构,很多语言都内置支持数组。数组是使用一块连续的内存空间保存数据,保存的数据的个数在分配内存的时候就是确定的:
这里写图片描述

访问数组中第 n 个数据的时间花费是 O(1) 但是要在数组中查找一个指定的数据则是 O(N)。当向数组中插入或者删除数据的时候,最好的情况是在数组的末尾进行操作,时间复杂度是O(1) ,但是最坏情况是插入或者删除第一个数据,时间复杂度是 O(N) 。在数组的任意位置插入或者删除数据的时候,后面的数据全部需要移动,移动的数据还是和数据个数有关所以总体的时间复杂度仍然是 O(N) 。
这里写图片描述

链表

链表是在非连续的内存单元中保存数据,并且通过指针将各个内存单元链接在一起,最有一个节点的指针指向 NULL 。链表不需要提前分配固定大小存储空间,当需要存储数据的时候分配一块内存并将这块内存插入链表中。
在链表中查找第 n 个数据以及查找指定的数据的时间复杂度是 O(N) ,但是插入和删除数据的时间复杂度是 O(1) ,因为只需要调整指针就可以。
这里写图片描述

这里写图片描述

这里写图片描述

向上面这样的链表结构在插入和删除的时候编程会比较困难,因为需要记住当前节点的前一个节点,这样才能完成插入和删除。为了简便通常使用带有头节点的链表:
这里写图片描述
上面的链表是单链表,此外还有双链表,就是节点中包含指向下一个节点的指针和指向上一个节点的指针:
这里写图片描述
不带有头节点的双向链表在插入和删除数据的时候也不会出现单链表那样的问题。此外还有一种链表是循环链表,它是将双向链表的头尾相接:
这里写图片描述
向循环双向链表和循环链表中插入或者从中删除数据只是多移动几个指针。

堆栈

堆栈实现了一种后进先出的语义 (LIFO) 。可以使用数组或者是链表来实现它:
这里写图片描述
对于堆栈中的数据的所有操作都是在栈的顶部完成的,只可以查看栈顶部的数据,只能够向栈的顶部压入数据,也只能从栈的顶部弹出数据。

    package stack;

    import java.util.Stack;

    public class Stacks {
        static String[] months = { "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月",
                "9月", "10月", "11月", "12月" };

        public static void main(String[] args) {
            Stack stack = new Stack();
            for (int i = 0; i < months.length; i++) {
                stack.push(months[i]);
            }
            System.out.println("Stack=" + stack);
            stack.addElement("The last line");
            System.out.println("element 5 = " + stack.elementAt(5));
            System.out.println("popping elements:");
            while (!stack.empty()) {
                System.out.println(stack.pop());
            }
        }
    }

队列

队列实现了先入先出的语义 (FIFO) 。队列也可以使用数组和链表来实现:
这里写图片描述

队列只允许在队尾添加数据,在队头删除数据。但是可以查看队头和队尾的数据。还有一种是双端队列,在两端都可以插入和删除:
这里写图片描述

    package vector;

    import java.util.Vector;

    public class Queue {
        static String[] months = { "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月",
                "9月", "10月", "11月", "12月" };

        public static void main(String[] args) {
            Vector v = new Vector();
            for (int i = months.length - 1; i >= 0; i--) {
                v.addElement(months[i] + " ");
                while (!v.isEmpty()) {
                    System.out.println(v.firstElement());
                    v.removeElement(v.firstElement());
                }
                v.clear();
            }
        }
    }

【万字总结】图解堆算法、链表、栈与队列(多图预警)

堆算法什么是堆堆(heap),是一类特殊的数据结构的统称。它通常被看作一棵树的数组对象。在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间较短的任务却可能需要等待很长时间才能开...
  • NoMasp
  • NoMasp
  • 2015年12月18日 08:40
  • 18359

链表与数组的区别及堆和栈的区别

链表与数组的区别A 从逻辑结构来看A-1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当     数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。A-2...

数组实现堆栈操作

感觉自己数据结构学的好慢啊。 感觉用不惯C++的输入输出,其实看我胡扯不如直接去看代码来的实在。 堆栈的在于查看是否满(溢出),或者为空(NULL) 上代码: // // main.cpp ...

用数组实现堆栈

堆栈(stack)是一组相同数据类型数据的集合,且拥有后入先出(last in first out)的特性,即堆栈的所有操作都是在顶端进行的。堆栈有五个基本操作: Create ...

数组、链表、堆栈和队列

数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合。听起来是不是很抽象,简单理解:数据结构就是描述对象间逻辑关系的学科。比如:队列就是一种先进先出的逻辑结构,栈是一种先进后出的逻辑结构,家谱...
  • amork
  • amork
  • 2012年02月14日 15:03
  • 17732

数组、链表、堆栈、队列和树

数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合。听起来是不是很抽象,简单理解:数据结构就是描述对象间逻辑关系的学科。比如:队列就是一种先进先出的逻辑结构,栈是一种先进后出的逻辑结构,家谱...

访问栈上的数组和堆中的数组的区别

先看一段简单的代码 void test() { int a[10] = {0}; int* b = malloc(10 * sizeof(int)); a[0] = 0; b[0]...

常见的线性列表结构---【数组、链表、栈、队列、堆】

我们在算法设计当中最常见的线性结构列表无非是一下几种:         1.数组:                   数组应该是我最常用的一种。他的存储地址是连续的,就是当我们新开辟一个数组时,...

队列,栈,堆栈,数组,链表特点与区别

1. 队列可以看成是有2个口的集合一个口叫队头一个叫队尾,只能在对头进行删除操作,在队尾做插入。根据这样的操作。队列特点是先进先出 2.堆栈可以看成是有1个口的集合,这个口叫栈顶。插入和删除操作只...

队列、堆栈与数组、链表的关系与区分

首先,明确两个概念:数据结构与数据存储结构!数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合。听起来是不是很抽象,简单理解:数据结构就是描述对象间逻辑关系的学科。比如:队列就是一种先进先出...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数组、链表、堆栈和队列
举报原因:
原因补充:

(最多只允许输入30个字)