&10 基本数据结构——栈,队列和链表
#1,栈(stack)
定义[来自百度]:栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
原理和操作:实现的是一种后进先出策略(last-in, first-out, LIFO),相关操作包括:判空(stack-empty)、出栈(stack-pop)和入栈(stack-push)。
特殊属性:S.top,其中,S是栈名,S.top指向最新插入的元素。若用数组实现栈,则S.top==i,i是数组的下标值。
stack-empty(S)
if S.top==
return true;
else
return false;
stack-empty
stack-push(S,x)
if S.top!=n
S.top=S.top+;
S[S.top]=x;
else
OVERFLOW;
stack-push
stack-pop(S)
if S.top!=
S.top=S.top-;
return S[S.top+];
else
UNDERFLOW;
stack-pop
#2,队列(queue)
定义[来自百度]:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
原理和操作:实现的是一种先进先出的策略(first-in, first-out, FIFO),相关操作有:入队(en-queue)和出队(de-queue)。
特殊属性:两个,Q.head指向对头元素,Q.tail指向下一个新元素将要插入的位置,其中Q是队列名。Q={Q[0],Q[1]..., Q[n-1]}={Q[Q.head], Q[Q.head+1]...,Q[Q.tail-1]},并在最后的位置“环绕”,感觉好像位置0紧邻在位置n-1后面形成一个环序。如果Q.head=Q.tail+1,队列是满的,再添加元素会发生上溢;同理,如果Q.head=Q.tail,继续出队则会发生下溢。
这里给出两个版本的伪代码,一个是我自己写的en-queue和de-queue,另一个是书中给出的EN-QUEUE和DE-QUEUE。
en-queue(Q,x)
if Q.head != Q.tail+
Q.tail = Q.tail+;
Q[Q.tail-]=x;
else
OVERFLOW;
en-queue
de-queue(Q)
if Q.head != Q.tail
Q.head=Q.head+;
reutrn Q[Q.head-];
else
UNDERFLOW;
de-queue
EN-QUEUE(Q, x)
Q[Q.tail]=x;
if Q.tail==Q.length
Q.tail=;
else
Q.tail=Q.tail+;
EN-QUEUE
DE-QUEUE(Q)
x=Q[Q.head];
if Q.head==Q.length;
Q.head=;
else
Q.head=Q.head+;
return x;
DE-QUEUE
#3,链表(list)
定义:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
原理和操作:分单链表和双链表,单链表的任意两个相邻元素之间是单箭头,而且所有的箭头方向都相同,双链表的任意相邻元素都是双箭头。而且两种链表都有搜索(list-reserch)、插入(list-insert)和删除(list-delete)操作。
特殊属性:单链表有链表头(L.head),指向链表的第一个元素;双链表有链表头(L.head)或者哨兵(L.nil)。
单链表的实现很容易,每个元素只有key和next两个属性值,方便处理。下面给出带(head)而非(哨兵)的双链表的各项操作伪代码:
lists-research(L, k)
x=L.head;
while x!=NULL and x.key!=k
x=x.next;
return x;
lists-research
lists-insert_head(L, x)
x.next=L.head;
if L.head!=NULL
x.next.prev=x;
L.head=x;//注意:一定要跟新list的head属性值
x.prev=NULL;
lists-insert_head
lists-delete(L, x)
if x.prev!=NULL
x.prev.next=x.next;
else
L.head=x.next;
if x.next!=NULL
x.next.prev=x.prev;
lists-delete
我也还在学习巩固中,如果文中所言有误,欢迎各位批评指正!
&10 基本数据结构——栈,队列和链表的更多相关文章
- 数据结构 栈&队列
2-4 依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是( ) 删除,移动头指针: 增加,移动尾指针: 删除a,b ,队头c 2-3 在一个链队列中,fron ...
- JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)
前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...
- 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列
栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...
- 【图解数据结构】 栈&队列
[TOC] 勤于总结,持续输出! 1.栈 1.1栈的定义 栈(stack)是限定在表尾进行插入和删除的操作的线性表. 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不包 ...
- 数据结构之队列and栈总结分析
一.前言: 数据结构中队列和栈也是常见的两个数据结构,队列和栈在实际使用场景上也是相辅相成的,下面简单总结一下,如有不对之处,多多指点交流,谢谢. 二.队列简介 队列顾名思义就是排队的意思,根据我们的 ...
- Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现
栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...
- 数据结构代码实现之队列的链表实现(C/C++)
上班闲着无聊,一直想着要开始写博客,但又不知道写什么.最近又回顾了下数据结构的知识,那就从数据结构开始吧. 前言 关于C语言结构体的知识以及队列的特性请读者自行了解,此处不做过多解释,嘻嘻. 同时此篇 ...
- java 集合 Connection 栈 队列 及一些常用
集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...
- Java 容器之 Connection栈队列及一些常用
集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...
随机推荐
- iOS设计模式 - 单例
备注:只能通过类的类方法才能创建单例类的实例,[[类名 alloc]init]创建实例没有用的. 原理图 说明 1. 单例模式人人用过,严格的单例模式很少有人用过 2. 严格的单例模式指的是无法通过常 ...
- windows 2008 r2 下面搭建 iis+sql server +php5.6 环境遇见的一些问题记录一下
由于web服务器以前在iis下部署有几个网站,现在这个项目开发又是用的php,本来php+mysql+iis应该很简单随便在网上能搜索出来很多,但是,由于以前那个web网站是用的sqlserver数据 ...
- Entity Framework做IN查询
开发中遇到的Too high level of nesting for select错误 项目使用了Entity Framework结合Mysql, 遇到了一个非常奇怪的性能问题,一个看起来非常简单的 ...
- 使用TRACE时 输出 _CrtDbgReport: String too long or IO Error
在VS2010中使用MFC,使用UNICODE 调用TRACE,输出_CrtDbgReport: String too long or IO Error 可尝试使用OutputDebugString函 ...
- 【log4net】配置
第一步在 AssemblyInfo 添加如下代码 第二步:在web.config添加如下代码: <log4net> <root> <level value=" ...
- Linux安装SmartSVN及破解
转载自:linux 下svn图形客户端smartsvn 安装 一.准备 smartsvn需要java支持,首先请确认机器上有没有安装java 另外还请确认环境变量里有没有JAVA_HO ...
- STM32启动文件选择说明
图1. STM32F10xxx标准外设库体系结构先说这个问题,大家都知道,我们在选择使用哪些外围的的时候,是去更改从官方模版中拷贝过来的stm32f10x_conf.h文件的27-48行,把我们要用的 ...
- sphinx增量索引
首先建立一个计数表,保存数据表的最新记录ID CREATE TABLE `sph_counter` ( `id` int(11) unsigned NOT NULL, `max_id` int(1 ...
- folly
一.简介 Folly是,Facebook于2012年6月初开源的一个基于C++11的C++组件库,提供了类似Boost库和std库的功能,包括散列.字符串.向量.内存分配.位处理等,以满足大规模高性能 ...
- 嵌入式Linux应用程序开发详解------(创建守护进程)
嵌入式Linux应用程序开发详解 华清远见 本文只是阅读文摘. 创建一个守护进程的步骤: 1.创建一个子进程,然后退出父进程: 2.在子进程中使用创建新会话---setsid(): 3.改变当前工作目 ...