【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