我必须在Tcl中实现队列或优先级队列而不使用任何库。
我试过写下面的代码。请帮助我在Tcl / Tk中以更好的方式实现队列。
创建节点
// crearting node element of queue
proc createNode {name cost} {
namespace eval $name [subst {
variable cost $cost
variable this $name
}]
功能
proc ${name}::getCost {} {
variable cost
return $cost
}
return $name
}
删除队列
proc deQueue name {
#upvar 1 $name queue
set queue $name
set res [lindex $queue 0]
set queue [lrange $queue 1 end]; # remove the first element
set res; # return the value
}
排队
proc enQueue {newNode name} {
#upvar 1 $name queue
set queue $name
set queue [concat $newNode $queue]
}
创建队列
proc makeQueue {n g } {
set queue [list [createNode $n $g ]]
return $queue
}
答案 0 :(得分:4)
一个简单的队列实现:
<div *ngFor="let item of lenght; let i = index">
<div *ngFor="let video of videos">
<ul>
<li>{{video.data[i].embed.html}}</li>
</ul>
</div>
</div>
一个简单的优先级队列:
proc enqueue {name item} {
upvar 1 $name queue
lappend queue $item
}
proc dequeue name {
upvar 1 $name queue
set queue [lassign $queue item]
return $item
}
% enqueue a foo
% set item [dequeue a]
队列或优先级队列唯一需要的是列表和添加/删除接口。
如果要将结构化数据存储在队列中,请将proc enpqueue {name prio item} {
upvar 1 $name queue
lappend queue [list $prio $item]
set queue [lsort -decreasing -integer -index 0 $queue]
}
proc depqueue name {
upvar 1 $name queue
set queue [lassign $queue prioitem]
return [lindex $prioitem 1]
}
% enpqueue a 10 foo
% enpqueue a 40 bar
% set item [depqueue a]
bar
作为数据元组:
item
或字典:
set item [list "Smith, John" 42 1500]
文档: lappend, lassign, lindex, list, lsort, proc, return, set, upvar
答案 1 :(得分:2)
队列是具有两个(关键)操作的抽象数据结构:add
和get
(以及empty
测试也很常见)。它们在内部非常复杂,在使用TclOO对象作为其实现方面可能最好考虑:
oo::class create Queue {
variable q
constructor {} {
set q {}
}
method add {item} {
lappend q $item
return
}
method empty {} {
expr {[llength $q] == 0}
}
method get {} {
if {[my empty]} {
return -code error "queue is empty"
}
set q [lassign $q item]
return $item
}
}
优先级队列就像队列一样,除了它们也有优先级并按该优先级排序。有效实施它们的技巧是不对每个add
或get
进行排序,而只是在必要时进行排序。 (或者你可以使用适当的平衡树,但它们非常复杂。)
oo::class create PriorityQueue {
variable q sorted
constructor {} {
set q {}
set sorted 1
}
method add {item priority} {
lappend q $item $priority
set sorted 0
return
}
method empty {} {
expr {[llength $q] == 0}
}
method get {} {
if {[my empty]} {
return -code error "queue is empty"
}
if {!$sorted} {
# You might want other options here, depending on what "priority" means
set q [lsort -stride 2 -index 1 -integer $q]
set sorted 1
}
set q [lassign $q item priority]
return $item
}
}
使用这些数据结构非常简单:
# Instantiate
set myq [PriorityQueue new]
# Add some values
$myq add "The quick brown fox" 12
$myq add "The lazy dog" 34
# Drain the queue
while {![$myq empty]} {
puts [$myq get]
}
# Get rid of it now we're done
$myq destroy