如何在不使用列表的情况下在Tcl中实现堆栈?

时间:2014-11-15 16:04:02

标签: data-structures stack tcl

我知道使用列表实现堆栈和队列非常容易。但是,如果不使用列表和列表操作函数(如lappendlindex),我将如何实现堆栈?

Actuallt我在Synopsys中使用Tcl,因此堆栈中的所有项目都是电路的一部分,如单元格,端口,网络......这些是synopsys中的集合,无法通过列表功能直接处理。

2 个答案:

答案 0 :(得分:0)

Tcl标准库中有struct::stack。当然,该包是使用列表实现的。

还可以将堆栈内容存储在分隔的字符串中,并添加/删除字符串的结尾。

或者,我认为,将堆栈内容编码为整数,并使用乘法,除法和模块操作来推送和弹出(值范围需要小于最小项目。)不。结果整数乘法是可交换的,谁知道呢?

答案 1 :(得分:0)

数据结构是一个列表。但是,您可以使用数组创建一个。以下是经典操作:

  • init设置空筹码
  • push向堆栈添加值
  • size报告堆栈中的元素数量
  • top查看堆栈中的最顶层值
  • pop删除并返回堆栈中最顶层的值
proc init {stackVar} {
    upvar 1 $stackVar stk
    unset -nocomplain stk
    set stk(top) -1
}
proc push {stackVar value} {
    upvar 1 $stackVar stk
    set stk([incr stk(top)]) $value
    return
}
proc size {stackVar} {
    upvar 1 $stackVar stk
    return [expr {$stk(top) + 1}]
}
proc top {stackVar} {
    upvar 1 $stackVar stk
    return $stk($stk(top))
}
proc pop {stackVar} {
    upvar 1 $stackVar stk
    set val $stk($stk(top))
    unset stk($stk(top))
    incr stk(top) -1
    return $val
}

未使用任何列表。但它比重要的基于列表的实现要重要得多。