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 = 0,last = -1}
end

为了避免污染全局名称空间,将在一个table内部定义所有的队列操作,这个table且称为List,将上例重写:

List = {}
function List.new()
    return {first = 0,last = -1} --这里没有看懂,为什么这样初始化?是为了下面popfirst操作中的first>last 的判断 为false,表示空队列吗?以后再深入了解
end

现在可以在常量时间内完成在两端插入或删除元素了(以下函数有点像操作Lua栈,first索引表示栈底,last表示栈顶,先这样理解吧,以后弄明白了再回来修改):

function List.pushfirst(list  , value)
    local first = list.first - 1    --从头push后,就要让头往下涨1
    list.first = first                --表示list["first"] = first
    list[first] = value               --表示first这个变量在表中的值,这两者容易搞混
end

function List.pushlast(list, value)
    local last = list.last + 1    --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 + 1    --弹出后,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 - 1     --弹出后,,last就要往下减1
    return value
end

如果希望该结构能严格地遵循队列的操作规范,那么只调用pushlast和popfirst就可以了。

时间: 2024-07-31 04:43:30

chapter11_2 Lua链表与队列的相关文章

Java数据结构——用双端链表实现队列

//================================================= // File Name : LinkQueue_demo //------------------------------------------------------------------------------ // Author : Common //类名:FirstLastList //属性: //方法: class FirstLastList_long{ private Lin

《Java数据结构与算法》笔记-CH5-链表-5用双端链表实现队列

1 //用双端链表实现队列 2 /** 3 * 节点类 4 */ 5 class LinkQ { 6 private long data; 7 public LinkQ next; 8 9 public LinkQ(long d) { 10 this.data = d; 11 } 12 13 public String toString() { 14 return String.valueOf(this.data); 15 } 16 } 17 /** 18 * 双端链表类 19 */ 20 cl

用结点实现链表LinkedList,用数组和结点实现栈Stack,用数组和结点链表实现队列Queue

一,用结点实现链表LinkedList,不用换JavaAPI的集合框架 import java.util.Scanner; public class Main { public static class Node { int data; Node next=null; public Node(int data){this.data=data;}; } public static class MyLinkedList { Node head=null; public MyLinkedList()

数据结构 - 基于链表的队列

基于链表的队列 当我们基于链表实现队列时,需要从一端加元素,另一端取出元素,就需要引入一个新的变量tail指向链表的尾部,此时,向尾部进行添加操作时间复杂度会变为O(1),然而删除操作还是需要从head向后遍历,所以此时选择链表尾为队尾,链表头为队首. 基于链表的实现的源码如下: package queue; import linkedList.LinkedList; public class LinkedListQueue<E> implements Queue<E> {    

泛型应用到链表的队列中来

package com.java.genericity.www; import java.util.LinkedList; public class GennericityDmeo { public static void main(String[] args) {  //创建一个linkedList集合  LinkedList<String> list;  //因为是内部类,所以创建对象是怎么创建的  GennericityDmeo.Queue q=new GennericityDmeo()

实现一个链表和队列

import java.text.SimpleDateFormat; import java.util.Calendar; import org.apache.log4j.Logger; /* * 实现一个泛型链表类接口, 1.链表增加一个节点, 2.指定位置增加一个节点 3.删除指定位置的节点 4.删除某种内容的所有节点 加上日志 * */ public class LinkMe { public static void main(String args[]){ //BasicConfigur

数据结构录 之 链表&amp;栈&amp;队列

三种基本的数据结构,来稍微说一下. 首先链表,这个几乎每本C++的语言书都会说的,直接看书上说的就好. 链表就是一个链,每一个都有一个指针指向下一个,然后这样串了起来.然后可以从头开始找,一直找到尾巴.然后对于某个数据点,都可以删除,只需要让他前面那个指向他后面那个,这样从头开始找的时候就找不到这个点了...在这个点之后添加一个点也是这样,直接让这个点指向那个新的,然后让新的指向原来这个点指向的后一个... 可以想象就是一个个点,然后第一个指向第二个,第二个指向第三个...就像是一条长长的链一样

基于链表的队列LinkedBlockingQueue学习

LinkedBlockingQueue为先进先出队列 1.链表中的节点,next为后继节点    static class Node<E> {        E item;        Node<E> next;        Node(E x) { item = x; } } 2.三种构造方法a.容量为最大值 b.容量为指定大小 c.容量为最大值,使用Collection c初始化队列 public LinkedBlockingQueue() {this(Integer.MAX

用链表实现队列的功能

链表不限定元素的长度,可以动态分配元素并添加,另外经常的增删是链表优于其他数据结构的特点. 今天我们用链表来实现一个队列. linkList.h #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define new(type) (type