Nim 语言实现简单的历史记录队列

160 阅读1分钟

Nim编程早茶

这一节,我们介绍如何使用 Nim 语言实现简单的定长队列。

保留后N个元素

有些时候,我们需要用到历史记录,我们只需要保存最后 N 个元素,我们可以使用链表来实现这种定长队列。 当新的元素加入,老的元素将会被移除。

定义对象

我们使用标准库的 list 中的单链表来实现定长队列。

len 是队列中元素个数,size 是队列的总容量。

import lists


type
  FixedQueue*[T] = object
    data: SinglyLinkedList[T]
    len: int
    size: int

# 队列初始化
proc newFixedQueue*[T](size: int=10): FixedQueue[T] =
  result.data = initSinglyLinkedList[T]()
  result.size = size
  result.len = 0

入队与出队

如果队列长度没有到达容量,我们直接增加元素。

如果队列长度达到了容量,我们删除首元素,并增加新元素。也就是说,当新的元素加入,老的元素将会被移除。队列长度也不再增长。

proc enQueue*[T](q: var FixedQueue[T], value: T) =
  var node = newSinglyLinkedNode[T](value)
  if q.len >= q.size:
    q.data.head = q.data.head.next
  else:
    q.len += 1 
  q.data.append(node)

proc enQueue*(q: var FixedQueue[string], file: File) =
  for line in file.lines:
    q.enQueue(line)

proc deQueue*[T](q: var FixedQueue[T]): T =
  q.data.head = q.data.head.next
  q.len -= 1

测试整数

var a = newFixedQueue[int]()
for i in 1 .. 35:
  a.enQueue(i)
echo a.data

读取文件最后几行

import os
from strformat import fmt

let file = getTempDir() / "temp.txt"
var f = open(file, fmReadWrite)
for i in 1 .. 100:
  write(f, fmt"我是第{i}行" & "\n")
f.setFilePos(0)

var b = newFixedQueue[string](10)
b.enQueue(f)
echo b
f.close()