先进先出, 队列跟栈一样,也是一种 操作受限的线性表数据结构

用数组实现的队列叫作 顺序队列,用链表实现的队列叫作 链式队列

链式队列实现

Golang

// 链式队列
package main

import (
    "fmt"
)

// 定义链表节点
type QueueNode struct {
    Value int
    Next  *QueueNode
}

// 初始化队列
var size = 0
var queue = new(QueueNode)

// 入队(从队头插入)
func Push(t *QueueNode, v int) bool {
    if queue == nil {
        queue = &QueueNode{v, nil}
        size++
        return true
    }

    t = &QueueNode{v, nil}
    t.Next = queue
    queue = t
    size++

    return true
}

// 出队(从队尾删除)
func Pop(t *QueueNode) (int, bool) {
    if size == 0 {
        return 0, false
    }

    if size == 1 {
        queue = nil
        size--
        return t.Value, true
    }

    // 迭代队列,直到队尾
    temp := t
    for (t.Next) != nil {
        temp = t
        t = t.Next
    }

    v := (temp.Next).Value
    temp.Next = nil

    size--
    return v, true
}

// 遍历队列所有节点
func traverse(t *QueueNode) {
    if size == 0 {
        fmt.Println("空队列!")
        return
    }
    for t != nil {
        fmt.Printf("%d -> ", t.Value)
        t = t.Next
    }
    fmt.Println()
}

func main() {
    queue = nil
    // 入队
    Push(queue, 10)
    fmt.Println("Size:", size)
    // 遍历
    traverse(queue)

    // 出队
    v, b := Pop(queue)
    if b {
        fmt.Println("Pop:", v)
    }
    fmt.Println("Size:", size)

    // 批量入队
    for i := 0; i < 5; i++ {
        Push(queue, i)
    }
    // 再次遍历
    traverse(queue)
    fmt.Println("Size:", size)

    // 出队
    v, b = Pop(queue)
    if b {
        fmt.Println("Pop:", v)
    }
    fmt.Println("Size:", size)

    // 再次出队
    v, b = Pop(queue)
    if b {
        fmt.Println("Pop:", v)
    }
    fmt.Println("Size:", size)
    // 再次遍历
    traverse(queue)
}

输出:

Size: 1
10 -> 
Pop: 10
Size: 0
4 -> 3 -> 2 -> 1 -> 0 ->
Size: 5
Pop: 0
Size: 4
Pop: 1
Size: 3
4 -> 3 -> 2 ->

本文由 一切随风 创作,可自由转载、引用,但需署名作者且注明文章出处。

8 条评论

  1. 鍗庣撼鍏徃鍚堜綔寮€鎴锋墍闇€鏉愭枡锛熺數璇濆彿鐮?5587291507 寰俊STS5099
    鍗庣撼鍏徃鍚堜綔寮€鎴锋墍闇€鏉愭枡锛熺數璇濆彿鐮?5587291507 寰俊STS5099

    华纳万宝路客服电话是多少?(?183-8890-9465—《?薇-STS5099】【?扣6011643??】
    华纳万宝路开户专线联系方式?(?183-8890--9465—《?薇-STS5099】【?扣6011643??】
    华纳圣淘沙客服开户电话全攻略,让娱乐更顺畅!(?183-8890--9465—《?薇-STS5099】客服开户流程,华纳圣淘沙客服开户流程图(?183-8890--9465—《?薇-STS5099】

  2. temgfippnl
    temgfippnl

    杰西

  3. splfgghopq
    splfgghopq

    家庭作业

  4. tjrzhytltx
    tjrzhytltx

    我和我的第二故乡

  5. yebflscnef
    yebflscnef

    古董计中计之龙璧之战

  6. eqvzcriguz
    eqvzcriguz

    小银幕大电影

  7. joqjwmykfy
    joqjwmykfy

    埃里克詹森警察还是毒枭

  8. anmziupfcj
    anmziupfcj

    思想的火花在字句间迸发,照亮认知盲区。

添加新评论