【Go】キューを書く

概要

いまさらですがキューを書きます。 元ネタは改訂第4版 C言語によるはじめてのアルゴリズム入門です。

本題

以下ソースコード

package main

import (
    "fmt"
)

const MAXSIZE = 5 // キューの最大長
var queue [5]int
var head int = 0 // キューの先頭
var tail int = 0 // キューの最後尾

func main() {
    var n int = 0
    for {
        fmt.Print("queuein(i) or queueout(o)?")
        var operator string
        fmt.Scanf("%s", &operator)

        if(operator == "queuein" || operator == "i"){
            fmt.Print("number: ")
                fmt.Scanf("%d", &n)
            if(queuein(n) == -1){
                fmt.Println("キューがいっぱいです")
            }
        }
        if(operator == "queueout" || operator == "o"){
            if(queueout(&n) == -1){
                fmt.Println("キューは空です")
            }
        }
        show()
    }
}

func queuein(n int) int {
    if(head != (tail + 1) % MAXSIZE){
        queue[tail] = n
        tail = (tail + 1) % MAXSIZE
        return 0
    }
    return -1
}

func queueout(n *int) int {
    if(head != tail){
        *n = queue[head]
        fmt.Println("out: ", *n)
        head = (head + 1) % MAXSIZE
        return 0
    }else{
        return -1
    }
}

func show() {
    fmt.Println("/////current queue/////")
    for i, v := range queue {
        if(i == head){
            fmt.Print("*")
        }
        if(i == tail){
            fmt.Print("~")
        }
        fmt.Printf("%d ", v)
    }
    fmt.Println("")
    fmt.Println("")
}

結果 *がついた部分はキューの先頭で、~がついた部分はキューの末尾。 queuein(i) or queueout(o)? と質問されるので、 queueinかiを入力すればキューに入れ、queueoutかiを入力すればキューから取り出すことができる。 queueinの場合はキューに入れる数値の入力を求められる。 queueoutの場合はキューから取り出した値を表示する。

queuein(i) or queueout(o)?i
number: 1
/////current queue/////
*1 ~0 0 0 0

queuein(i) or queueout(o)?i
number: 2
/////current queue/////
*1 2 ~0 0 0

queuein(i) or queueout(o)?i
number: 3
/////current queue/////
*1 2 3 ~0 0

queuein(i) or queueout(o)?i
number: 4
/////current queue/////
*1 2 3 4 ~0

queuein(i) or queueout(o)?i
number: 5
キューがいっぱいです
/////current queue/////
*1 2 3 4 ~0

queuein(i) or queueout(o)?o
out:  1
/////current queue/////
1 *2 3 4 ~0

queuein(i) or queueout(o)?o
out:  2
/////current queue/////
1 2 *3 4 ~0

queuein(i) or queueout(o)?o
out:  3
/////current queue/////
1 2 3 *4 ~0

queuein(i) or queueout(o)?o
out:  4
/////current queue/////
1 2 3 4 *~0

queuein(i) or queueout(o)?o
キューは空です
/////current queue/////
1 2 3 4 *~0