- Golangの標準ライブラリにDeque両端キューが見つからなかったので自作した
- sliceの先頭に追加する処理は(実装によるだろうが)遅かったので採用していない
package main
import (
"fmt"
)
func newDeque() *deque {
return &deque{}
}
type deque struct {
prep []interface{}
ap []interface{}
}
func (d *deque) push(item interface{}) {
d.ap = append(d.ap, item)
}
func (d *deque) unshift(item interface{}) {
d.prep = append(d.prep, item)
}
func (d *deque) empty() bool {
return len(d.ap) == 0 && len(d.prep) == 0
}
func (d *deque) pop() interface{} {
lenap := len(d.ap)
if lenap != 0 {
v := d.ap[lenap-1]
d.ap = d.ap[:lenap-1]
return v
}
v := d.prep[0]
d.prep = d.prep[1:]
return v
}
func (d *deque) shift() interface{} {
lenprep := len(d.prep)
if lenprep != 0 {
v := d.prep[lenprep-1]
d.prep = d.prep[:lenprep-1]
return v
}
v := d.ap[0]
d.ap = d.ap[1:]
return v
}
func main() {
q := newDeque()
for i := 1; i < 10; i++ {
q.push(i)
}
for i := 1; i < 10; i++ {
q.unshift(i)
}
q.push(-999)
for !q.empty() {
fmt.Println(q.pop())
}
for i := 1; i < 10; i++ {
q.push(i)
}
for i := 1; i < 10; i++ {
q.unshift(i)
}
q.push(-999)
for !q.empty() {
fmt.Println(q.shift())
}
}