数据结构与算法分析(2)——表、栈和队列
抽象数据类型
抽象数据类型(ADT)是一系列操作的集合。诸如表、集合、图和他们的操作一起可以看做是抽象数据类型
表 List
表的实现有两种:数组和链表。数组实现的表在插入和删除操作上的花费十分惊人,最坏的情况为O(N),而且数组的大小必须事先指定,意味着表的大小有一个固定的上限,如果这个值很大的话会浪费很大的空间,很小的话又不能满足使用要求,因此表的实现一般采用链表的方式。
链表的节点是一个结构体,结构体内有数据域和下一节点的指针。
struct Node
{
ElementType Element; //数据域
Position Next; //下一节点指针
}
一般情况下,我们会设置一个表头(Header),表头是个哑节点,只包含了链表第一个元素的地址。这样做的目的是解决在表的第一个元素之前插入元素或者删除表的第一个元素造成的表丢失的风险。给出几个表的基本操作代码。
int isEmpty(List L)
{
return L->Next == NULL; //空列表表头的下一个元素不存在,因此测试为真将返回1.
} int isLast(Position P, List L)
{
return P->Next == NULL; //最后一个元素的下个元素不存在,因此测试为真返回1.
} Position find(ElementType x, List L)
{
Position p = L->Next; while(p != NULL && p->Element != x)
p = p->Next; return p; //若没有找到,此时的p便为NULL。
} Position findPrevious(ElementType x, List L)
{
Position p = L; //要找x元素的前一个节点,需要从表头开始。 while(p->Next != NULL && p->Next->Element != x)
p = p->Next; return p; //若x不存在L中,将返回最后一个元素的位置,最后一个元素不可能是某个节点的前驱。 } void delete(ElementType x, List L)
{
Position p, temp; p = findPrevious(x,L); //删除节点是需要用到前驱的指针
while(p->Next != NULL) //测试p是不是最后一个节点。可以写一个函数isLast()来进行测试。
{
temp = p->Next;
p->Next = temp->Next;
free(temp);
} //在位置p处插入节点,可以在p前也可在p后,此处采用在p后。
void insert(ElementType x, Position p, List L)
{
Position temp; temp = malloc(sizeof(Node)); //malloc返回void*类型,未定义类型指针可以指向任何类型。 if(temp == NULL)
printerror("No More Space!"); temp->Element = x;
temp->Next = p->Next;
p->Next = temp; }
另外,链表还有双链表以及循环链表,它们的原理与单链表大同小异,这里不多加叙述了。
算法举例(1)——基数排序
未完待续
栈 Stack
栈是限制插入和删除只能在一个位置上进行的表,即只能在栈顶进行操作。基本操作是Push(入栈)和Pop(出栈),可能还有Top(返回栈顶元素)。栈也叫LILO(先进先出)表。一般来说,栈只有栈顶元素是可见的。
数据结构与算法分析(2)——表、栈和队列的更多相关文章
- python数据结构与算法第六天【栈与队列】
1.栈和队列的原理 栈:后进先出(LIFO),可以使用顺序表和链表实现 队列:先进先出(FIFO),可以使用顺序表和链表实现 2.栈的实现(使用顺序表实现) #!/usr/bin/env python ...
- 【数据结构与算法】001—栈与队列(Python)
栈与队列 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIFO)的特征 2.队列(queue)是一种具有先进先出 ...
- 纯数据结构Java实现(2/11)(栈与队列)
栈和队列的应用非常多,但是起实现嘛,其实很少人关心. 但问题是,虽然苹果一直宣传什么最小年龄的编程者,它试图把编程大众化,弱智化,但真正的复杂问题,需要抽丝剥茧的时候,还是要 PRO 人士出场,所以知 ...
- C语言数据结构——第三章 栈和队列
三.栈和队列 栈和队列是两种重要的线性结构.从数据结构的角度来看,栈和队列也是线性表,它的特殊性在于栈和队列的基本操作是线性表操作的子集,它们的操作相对于线性表来说是受到限制的,因此,可以称其为限定性 ...
- C语言数据结构基础学习笔记——栈和队列
之前我们学过了普通的线性表,接下来我们来了解一下两种特殊的线性表——栈和队列. 栈是只允许在一端进行插入或删除的线性表. 栈的顺序存储结构也叫作顺序栈,对于栈顶指针top,当栈为空栈时,top=-1: ...
- 3-6-汉诺塔(Hanoi Tower)问题-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第3章 栈和队列 - 汉诺塔(Hanoi Tower)问题 ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版> ...
- LeetCode通关:栈和队列六连,匹配问题有绝招
刷题路线参考: https://github.com/chefyuan/algorithm-base https://github.com/youngyangyang04/leetcode-maste ...
- 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放
01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...
- 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes
表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...
随机推荐
- HDU4612 Warm up 边双(重边)缩点+树的直径
题意:一个连通无向图,问你增加一条边后,让原图桥边最少 分析:先边双缩点,因为连通,所以消环变树,每一个树边都是桥,现在让你增加一条边,让桥变少(即形成环) 所以我们选择一条树上最长的路径,连接两端, ...
- 标准的TCP/IP工业以太网-EtherNet/IP
标准的TCP/IP工业以太网-EtherNet/IP 徐智穹以太网具有传输速度高.兼容性好.应用广泛等方面的优势,支持几乎所有流行的网络协议,其中 ...
- 4.4 CUDA prefix sum一步一步优化
1. Prefix Sum 前缀求和由一个二元操作符和一个输入向量组成,虽然名字叫求和,但操作符不一定是加法.先解释一下,以加法为例: 第一行是输入,第二行是对应的输出.可以看到,Output[1] ...
- mfc的一个串口类
这几天一直再看串口相关知识,对于其总结为如下串口类: 头文件声明如下: #pragma once // 声明当串口接收到线程的时候调用的函数指针 // 参数: 1,接收到的数据: 2,数据长度: 3, ...
- HTML-css selector
Css selector 基本有三种 HTML(TAG)selector , ID selector , Class selector css selector 综合使用 : 重用,子选择器,组选择器 ...
- ubuntu 运行android sdk 下的工具adb报bash: ./adb: No such file or directory
运行adb出现这种错误: bash: ./adb: No such file or directory 但adb确实存在. 可能1:你用的是64位的Linux,没装32位运行时库,安装 $ sud ...
- elecworks中“插入点”的意思
elecworks中自建符号时,”插入点“的用法: 插入点的作用是:建好的符号加入符号库后,从库里调用符号到原理图中时“插入点”就是符号的中心点---鼠标光标拖动的点. (插入点即为符号调出 时插入图 ...
- nyoj 69 数的长度
数的长度 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出 ...
- hdoj 1008 Elevator
Elevator Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- SQL提高查询效益之in、not in、between、like等条件讲述
在使用SQL语句查询数据库记录时,如果要查询相同的内容,有着不同的多种方法. 仍然,尽管使用多种方法可以得到相同的结果,但是,如果您使用不同的方法,在执行效益上是截然不同的.因此,我们得仔细考虑,如果 ...