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 ...
随机推荐
- NGINX----源码阅读---config配置脚本
config文件为nginx的配置入口文件. 1. #!/bin/sh # Copyright (C) Igor Sysoev # Copyright (C) Nginx, Inc. LC_ALL=C ...
- SEO之关键词选择
在网站优化中,关键词应该是奠基石,选择好关键词的重要性也不言而喻了.怎样选择合理化的关键词呢?这个是我今天了解到的. 1.选择的关键词首先是有人搜索过的.没人搜索的词优化就是浪费时间. 2.做有效流量 ...
- ios开发之简单实现loading动画效果
最近有朋友问我类似微信语音播放的喇叭动画和界面图片加载loading界面是怎样实现的,是不是就是一个gif图片呢!我的回答当然是否定了,当然不排除也有人用gif图片啊!下面我就来罗列三种实现loadi ...
- node.js---package.json文件
描述包的文件是package.json文件. 一个这样的文件,里面的信息还是挺大的.我们可以放弃手动建立.为了练手我们有命令行来建一个这样的包; 完成name,varsion....license项的 ...
- Python学习笔记——进阶篇【第九周】———线程、进程、协程篇(队列Queue和生产者消费者模型)
Python之路,进程.线程.协程篇 本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Ev ...
- [Q]将图纸转换为JPG、PNG、plt、DWF、DWFx,XPS等格式文件
如要将图纸打印为图片,请选择“PublishToWeb JPG.pc3”或“PublishToWeb PNG.pc3”打印机. 如要将图纸打印为plt格式文件,请选择“Windows Default ...
- Postman怎么用?
国庆期间的工作就是搞清楚postman怎么用?
- java 时间
package com.grace.test; import java.text.DateFormat; import java.text.ParseException; import java.te ...
- 安装PHP
'./configure' '--prefix=/usr/local/php5.6.21' '--with-config-file-path=/usr/local/php5.6.21/etc' '-- ...
- 关于git提交、还原使用
1.本地修改,未提交到本地仓库,想要恢复到修改前 右键这个文件-team-show local hostory -找到某一版本-右键-get Contents 即可恢复到某一版本 2. 命令:git ...