数据结构_2

回顾前一篇:

数据结构的作用是按照一定的规则管理和操作数据,有利于程序的编写。

顺序表最简单的可以用数组来实现。可以动态地静态地定义一张顺序表,而数组是以静态定义的。静态定义所分配的内存空间是在栈上的,固定且连续的,不可改动。动态定义所分配的空间是在堆上的,可操作的。当然也是连续的,可以进行扩展(不能缩小吧?),使用完毕后需手动释放,系统不会自动回收,与静态不同。

生成一张顺序表→插入元素→删除元素→系统自动回收/手动释放

链表的操作和顺序表含义是一致的。静态链表的话类似于数组,结点都由程序定义好了,不是临时开辟的,所以链表一般都是动态的。

创建一个链表→插入节点→删除节点→销毁链表。链表使用完后建议销毁它,占内存,动态需要手动释放。方法是:顺着链表,同时释放结点,将表头指针移至表尾,将表头*list的内容置为NULL,这样链表list就空了,防止list变为野指针。



下面谈谈“栈”和“队列”

栈:“栈”是线性表的一种具体形式,其功能是“先进后出”(LIFO).对栈的操作只能在表尾操作,表尾称为:栈定(top),表头称为:栈底(base/bottom)。栈像个子弹膛,最先进的子弹一定最后弹出。一般栈是以顺序表为基础的,所以一般都是顺序栈。

最开始栈中不含任何数据,叫做空栈,此时栈顶就是栈底。创建一个空栈,首先必须开辟一段连续的空间,此时栈顶与栈底相同。往栈中存放数据,叫做入栈操作,又称压栈。每压入一个数据,top指针自增1.如果栈满了,可追加空间。出栈即top指针减1,再取出指针指向的内容。直到top指针与base指针相同。清空一个栈,将base指针赋值给top指针,表明栈已空。销毁一个栈则不同,首先要释放掉内存空间,然后top和base指针置NULL,设置栈的最大容量为0,计算当前栈的容量只需对top减去base即可。注意:内存空间和当前容量不是一个概念。

队列:“队列”同样需要顺序表或链表为基础,也就是说可以用链表或顺序表来构造一个队列。与栈不同,其功能是先进先出(LIFO)。它要求数据从队尾(rear)进,从对头(front)出。下面介绍链队列的操作。创建一个队列,首先要在内存中创建一个头结点,不存放数据,只是为了方便操作而添加的。当然也可以不定义。然后将队列的头指针和尾指针都指向这个头结点。此时为一个空队列。队列的其他操作含义和栈一致,主要是对结点的指针进行操作,关键是先进先出(LIFO)。销毁队列和销毁链表方法类似。

还有一种用顺序表实现的队列叫做循环队列,其空间可以循环使用。循环队列一般有固定的容量,同样要求先进先出。其逻辑上是循环的,物理上是线性的。整个循环队列逻辑上就是一个缓冲区。循环队列的实现有点像栈,只是当rear指针超出了队列的地址范围时,进行取模运算,使其重新指向0号单元。



时间: 2024-08-10 11:26:54

数据结构_2的相关文章

数据结构_2 查找

线性查找分为顺序查找.折半查找. 顺序查找: 折半查找:  第一: 数组必须有序,不是有序就必须让其有序. 第二: 这种查找只限于线性的顺序存储结构.  线性查找时间复杂度:O(n); 折半无序(用快排或堆排)的时间复杂度:O(NlogN)+O(logN); 折半有序的时间复杂度:O(logN); 哈希查找: ①:  key尽可能的分散,也就是我丢一个"6"和"5"给你,你都返回一个"2",那么这样的哈希函数不尽完美. ②: 哈希函数尽可能的简单

《数据结构》_2线性表

线性表定义 线性表是零个或多个数据元素构成的线性序列,是最基础.最常用的一种线性数据结构. 线性表的顺序存储结构和实现 线性表的顺式存储.c #include<stdio.h> #include<stdlib.h> #define ERROR 0 #define OK 1 #define Overflow 2//上溢 #define Underflow 3//下溢 #define NotPresent 4//元素不存在 #define Duplicate 5//有重复元素 type

数据结构与算法(1)支线任务4——Lowest Common Ancestor of a Binary Tree

题目如下:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/ Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According to the definition of LCA on Wikipedia: “The lowest common ancestor is def

数据结构和算法 &ndash; 2.基础查找算法

1.顺序查找 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 数据结构和算法 { class _2 { public readonly static int[] arrayList = new int[] { 312, 564, 1254, 145, 212, 884, 145, 1212, 4

图形界面编程_2

上次说了,如果不添加事件,点击窗口右上方的X,窗口是不会关闭的,现在要说一下,这是在awt下Frame的情况,如果是使用swing下的JFrame,则不需要添加事件即可直接关闭按钮,awt的功能,swing基本上可以完全取代,而且用swing的组件实现的窗口外观上也比awt的组件实现的窗口要美观一些,如下图所示:            下面会主要使用swing,举一些例子 例1: import java.awt.*; import javax.swing.*; public class san

【数据结构】7. 排序

目录 7.1 排序的基本概念 7.1.1 排序的定义 7.2 插入排序 7.2.1 直接插入排序 7.2.2 折半插入排序 7.2.3 希尔排序 7.3 交换排序 7.3.1 冒泡排序 7.3.2 快速排序 7.4 选择排序 7.4.1 简单选择排序 7.4.2 堆排序 7.5 归并排序和基数排序 7.5.1 归并排序 7.5.2 基数排序 7.6 各种内部排序算法的比较及应用 7.6.1 内部排序算法的比较 7.6.2 内部排序算法的应用 7.7 外部排序 7.7.1 外部排序的基本概念 7.

Scala 基础(2)—— 基本数据结构

1. Scala 的面向对象 在学习 Java 的时候,我们说 Java 是一门面向对象的语言,然而 Java 其实并没有完全遵守"一切皆对象"这一准则. 例如:Java 的8种基本数据类型 & Java 的数组. 但是 Scala 相比而言,是一门更加纯粹的面向对象的语言,因为它完全遵守"一切皆对象". 2. 数组 Array Scala 中定义了数组对象 scala.Array. 我们可以这么初始化一个数组对象: val array = new Arra

大数据技术之_16_Scala学习_08_数据结构(下)-集合操作+模式匹配

第十一章 数据结构(下)-集合操作11.1 集合元素的映射-map11.1.1 map 映射函数的操作11.1.2 高阶函数基本使用案例1+案例211.1.3 使用 map 映射函数来解决11.1.4 模拟实现 map 映射函数的机制11.1.5 课堂练习11.2 集合元素的扁平-flatMap11.3 集合元素的过滤-filter11.4 集合元素的化简-reduce11.5 集合元素的折叠-fold11.6 集合元素的扫描-scan11.7 集合的综合应用案例11.8 集合的合并-zip11

【数据结构】之散列链表(Java语言描述)

散列链表,在JDK中的API实现是 HashMap 类. 为什么HashMap被称为"散列链表"?这与HashMap的内部存储结构有关.下面将根据源码进行分析. 首先要说的是,HashMap中维护着的是一个数组: transient Node<K,V>[] table; ,数组中的每个元素都是一个 Node 对象.这里的Node是HashMap的一个内部类,代码如下: static class Node<K,V> implements Map.Entry<