我知道使用列表实现堆栈和队列非常容易。但是,如果不使用列表和列表操作函数(如lappend
和lindex
),我将如何实现堆栈?
Actuallt我在Synopsys中使用Tcl,因此堆栈中的所有项目都是电路的一部分,如单元格,端口,网络......这些是synopsys中的集合,无法通过列表功能直接处理。
答案 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
}
未使用任何列表。但它比重要的基于列表的实现要重要得多。