盒子
盒子
文章目录
  1. Nim编程早茶
    1. 保留后N个元素
    2. 定义对象
    3. 入队与出队
    4. 测试整数
    5. 读取文件最后几行

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

Nim编程早茶

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

保留后N个元素

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

定义对象

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

入队与出队

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

测试整数

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

读取文件最后几行

1
2
3
4
5
6
7
8
9
10
11
12
13
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()