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 数据结构
每月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