8 个版本 (重大变更)

0.14.1 2024年5月7日
0.14.0 2024年3月25日
0.13.0 2023年4月14日
0.12.0 2023年4月8日
0.1.0 2023年3月24日

#633 in 数据结构

Download history 122/week @ 2024-05-04 7/week @ 2024-05-11 3/week @ 2024-05-18 2/week @ 2024-05-25 6/week @ 2024-06-29 43/week @ 2024-07-06 17/week @ 2024-07-27

每月60次下载
用于 bundvm

自定义许可证

17KB
402

栈上有什么?

什么是二维栈?rust_twostack 库提供了二维栈结构的实现能力。此数据结构可以存储由 rust_dynamic 库提供的动态类型值。您很可能非常熟悉 LIFO 或 FIFO 栈作为数据结构,它设计用于存储可以推送到前端或后端,并根据应用程序逻辑从 LIFO 或 FIFO 队列中提取的值。但这个经过时间考验的想法有什么问题呢?

rust_twostack 提供了一种数据结构,它可以存储值的栈的栈。当您执行复杂的基于栈的计算时,单个栈并不能为您提供一些必要的保护

数据隔离。当您将多个计算步骤相关的所有数据都放置在单个栈上时,忽视数据边界是一个基本的错误,这可能导致计算中非常昂贵的错误。

数据分离。当您编写数据处理管道时,您的应用程序通常在首先获取和预处理数据时工作,然后对准备好的数据进行分析。这些努力需要您访问不同的来源并利用各种预处理逻辑。将通常不相关的数据放入同一个栈是一个糟糕的想法,也是设计不佳的例子。

因此,有了栈的栈的概念,您可以准备数据段,每个数据段都在独立的栈空间中,并以可控的方式处理和合并它们。

栈的栈有什么特性?

  • rust_twostack 提供了一个名为 TS 的结构,用于控制栈结构的基础双端缓冲区
  • 您可以旋转、创建新的栈、访问当前栈以及从栈的栈中删除栈
  • 栈可以是匿名的或命名的。您可以旋转栈的栈,并根据其名称定位栈以成为当前栈

如何创建栈的栈?

// You call a ::new() function like this
let ts = TS::new();

如何控制栈的栈?

以下是控制栈的栈的 TS 对象方法的列表。

函数名 描述
TS::new() 创建一个新的栈堆实例。添加一个匿名栈作为初始默认栈。
TS.clear() 首先删除所有已创建的栈,然后添加一个匿名栈作为初始默认栈。
TS.ensure() 如果栈堆为空,则添加一个新的匿名栈。
TS.len() 返回栈的数量。
TS.is_empty() 如果栈堆为空,则返回“true”,否则返回“false”。注意,如果您得到“false”,则可能是由于内部错误,您正在处理损坏的结构。
TS.stack_len() 返回当前栈中的元素数量。
TS.current() 返回当前栈的引用,该栈持有数据,或None。如果此函数返回None,则可能是由于内部错误,您正在处理损坏的结构。
TS.push() 将数据推入当前栈。
TS.pull() 从当前栈中拉出并删除数据,返回数据元素或如果栈为空则返回None。
TS.add_stack() 添加新的匿名数据栈并将其设置为当前栈。
TS.add_named_stack() 添加新的命名数据栈并将其设置为当前栈。
TS.position() 通过名称在栈堆中定位栈并将其设置为当前栈。
TS.swap() 对于至少有2个元素深度的当前栈,此方法将交换栈的最后一个两个元素。
TS.dup() 复制栈顶的数据值。
TS.drop() 删除顶部栈。
TS.return_to() 从当前栈中拉出值,删除栈并将值推到新的当前栈。
TS.pull_to() 从上一个栈中拉出元素并将其推到当前栈。
TS.apply(Value, StackOp) 将元素应用于栈,并将栈的状态转换为元素的属性。StackOp的可能值有:StackOp::None - 不修改栈状态添加元素,StackOp::TakeOne - 从栈中取出一个元素并将其推到Value属性的起始位置,StackOp::TakeAll - 从栈中取出所有元素并将其添加到属性的起始位置。
TS.eval() 在栈上下文中执行Value通过CtxFun。

如何控制数据栈?

您可以通过调用TS.current()来访问数据栈。之后,您可以通过调用对象方法直接控制它。

函数名 描述
Stack.len() 返回栈中数据元素的数量。
Stack.is_empty()) 如果数据栈为空,则返回“true”。
Stack.peek() 返回数据栈中当前元素的引用,而不会将其从栈中移除。如果栈为空,则返回None。
Stack.pull() 从栈中删除并返回当前元素。
Stack.push() 将新数据元素推入栈。
Stack.clear() 从栈中删除所有元素。
Stack.pull() 从栈中删除并返回当前元素。
Stack.left() 将数据栈向左旋转一个位置。
Stack.right() 将数据栈向右旋转一个位置。

依赖关系

~5.5–8MB
~142K SLoC