如何在Tcl中实现队列和优先级队列?

时间:2017-01-18 13:10:26

标签: data-structures tcl

我必须在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   
        }   

2 个答案:

答案 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]

文档: lappendlassignlindexlistlsortprocreturnsetupvar

答案 1 :(得分:2)

队列是具有两个(关键)操作的抽象数据结构:addget(以及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
    }
}

优先级队列就像队列一样,除了它们也有优先级并按该优先级排序。有效实施它们的技巧是对每个addget进行排序,而只是在必要时进行排序。 (或者你可以使用适当的平衡树,但它们非常复杂。)

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