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()