chapter11_2 Lua链表与队列
链表
由于table是动态的实体,所以在Lua中实现链表是很方便的。每个节点以一个table来表示,一个“链表”只是节点table中的一个字段。
该字段包含了对其他table的引用。例如,要实现一个基础的列表,其中每个节点具有两个字段:next和value
创建一个链表:
list = nil
list = {next = list,value = v}
--遍历此链表
local l = list
while l do
<访问 l.value >
l = l.next
end
也可以参考之前的一篇文章:Chapter7 迭代器 中的 3、无状态的迭代器 里的例子,实现了链表的初始化和遍历。
至于其他类型的列表,例如双向链表或环形表,都可以使用相同的方法实现。
然而,在Lua中很少需要这类的结构,因为通常存在着一些更简单的方式来表示数据。
例如可以通过一个(几乎无限大的)数组来表示一个栈。
队列与双向队列
在Lua中实现队列的一种简单方法是使用table库的函数insert和remove。这两个函数可以在一个数组的任意位置插入或删除元素。
并且根据操作要求移动后续元素。对于较大的结构,移动的开销是很大的。
一个高效的实现是使用两个索引,分别用于首尾的两个元素:
function ListNew()
return {first = ,last = -}
end
为了避免污染全局名称空间,将在一个table内部定义所有的队列操作,这个table且称为List,将上例重写:
List = {}
function List.new()
return {first = ,last = -} --这里没有看懂,为什么这样初始化?是为了下面popfirst操作中的first>last 的判断 为false,表示空队列吗?以后再深入了解
end
现在可以在常量时间内完成在两端插入或删除元素了(以下函数有点像操作Lua栈,first索引表示栈底,last表示栈顶,先这样理解吧,以后弄明白了再回来修改):
function List.pushfirst(list , value)
local first = list.first - --从头push后,就要让头往下涨1
list.first = first --表示list["first"] = first
list[first] = value --表示first这个变量在表中的值,这两者容易搞混
end function List.pushlast(list, value)
local last = list.last + --push后,last就要往上增长1
list.last = last
list[last] = value
end function List.popfirst(list)
local first = list.first
if first > list.last then error("list is empty") end
local value = list[first]
list[first] = nil --允许垃圾回收
list.first = first + --弹出后,first就要往上加1
return value
end function List.poplast(list)
local last = list.last
if list.first > last then error("list is empty") end
local value = list[last]
list[last] = nil --允许垃圾回收
list.last = last - --弹出后,,last就要往下减1
return value
end
如果希望该结构能严格地遵循队列的操作规范,那么只调用pushlast和popfirst就可以了。
chapter11_2 Lua链表与队列的更多相关文章
- Java数据结构——用双端链表实现队列
//================================================= // File Name : LinkQueue_demo //---------------- ...
- Lua中实现队列(高效方式)
转自http://www.cnblogs.com/stephen-liu74/archive/2012/06/25/2417894.html 在Lua中实现队列的简单方法是使用table库函数inse ...
- 教你如何使用Java手写一个基于链表的队列
在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...
- 利用 C++ 单向链表实现队列
利用C++ 单向链表实现数据结构队列,其实和上一篇基本内容相同,仅仅是插入的时候在链表的尾部插入,取元素都是一样的,都从头部取. #pragma once #include "stdio.h ...
- 队列queue(2):链表实现队列
基本概念 队列是只允许在一端进行插入操作,另一端进行删除操作的线性表. 我们规定,允许删除的叫做队首"head",允许插入的叫做队尾"tail". 基本操作 我 ...
- Java之使用链表实现队列
import java.util.Iterator; import java.util.NoSuchElementException; /** * 使用链表来实现队列 * 1.考虑结点的结构,包括当前 ...
- 并发编程-concurrent指南-阻塞队列-链表阻塞队列LinkedBlockingQueue
LinkedBlockingQueue是一个基于链表的阻塞队列. 由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选. LinkedBlocki ...
- 使用python实现数组、链表、队列、栈
引言 什么是数据结构? 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中. 比如:列表,集合和字 ...
- 链表实现队列(python)
# -*- coding: utf-8 -*- from collections import deque class Node(object): def __init__(self, value=N ...
随机推荐
- java程序基础
- bind() unbind()绑定解绑事件
.bind( eventType [, eventData], handler(eventObject)) 本文实例分析了JQuery中Bind()事件用法.分享给大家供大家参考.具体分析如下: .B ...
- android之控件与布局
基本控件:TextViewButtonEditTextImageViewAlertDialog.BubliderProgressDialog 四种基本布局的特殊属性: LinerLayout andr ...
- python项目练习地址
作者:Wayne Shi链接:http://www.zhihu.com/question/29372574/answer/88744491来源:知乎著作权归作者所有,转载请联系作者获得授权. 目前是3 ...
- BFS - leetcode [宽度优先遍历]
127. Word Ladder int size = q.size(); for(int k = 0; k < size; k++){//for 次数 找到一个erase一个 q里面加入的是所 ...
- Silverlight 中MatrixTransform和其他Transform的数值转换
对各种transform的讲解已经很多了,但是有时MatrixTransform和其他transform变换效果之间需要转换时,变换量的转换又如何呢?下面的类就完成了Matrix和其他transfor ...
- JS:JSP Servlet
Servlet 是在服务器上运行的小程序.这个词是在 Java applet的环境中创造的,Java applet 是一种当作单独文件跟网页一起发送的小程序,它通常用于在客户端运行,结果得到为用户进行 ...
- Linux常用命令汇总及使用方法(一)
最近开始学习Linux,但是因为原来没有接触过,所有现在先将Linux中常用的命令记录下来,方便自己后期使用. 1.登陆 通过secureCRT/xshell/ssh等软件远程登陆Linux (1)# ...
- Spring.net 学习IOC------准备
在学习spring.net开始时,我们首先要下载spring.net所用到的类库: Common.Logging.dll(必要)Spring.Core.dll(必要)Spring.Data.dllSp ...
- maven添加本地依赖包方法
1.某些情况下不方便上传本地依赖包到Maven repository,可以通过下面方法添加本地依赖包. 2.方法 1).pom.xml中添加以下代码块 <dependency> <g ...