数据结构与算法:单向队列和环形队列

以下演示的是添加到末尾,若采用双向可以从前后任意方向取和追加(先进先出和先进后出)

单向队列的增删

package main

import (
	"errors"
	"fmt"
	"os"
)

const (
	MaxQueueSize = 10
)

type Queue struct {
	maxSize int
	front   int
	rear    int
	array   [MaxQueueSize]string
}

//goland:noinspection ALL
func (this *Queue) addQueue(val string) (err error) {
	if this.rear == this.maxSize-1 {
		err = errors.New("队列已满")
	} else {
		this.rear++
		this.array[this.rear] = val
	}
	return
}

func (this *Queue) getQueue() (val string, err error) {
	if this.front == this.maxSize-1 {
		err = errors.New("队列已空")
	} else {
		this.front++
		val = this.array[this.front]
		this.array[this.front] = ""
	}
	return
}

func (this *Queue) showQueue() {
	for i := this.front + 1; i <= this.rear; i++ {
		fmt.Println(i, this.array[i])
	}
	fmt.Println()
}
func main() {
	queue := Queue{maxSize: MaxQueueSize, front: -1, rear: -1}

	for {
		var key string
		var val string
		fmt.Println("1、输入add  添加对列")
		fmt.Println("2、输入get  获取对列")
		fmt.Println("3、输入show 显示对列")
		fmt.Println("4、输入exit 退出系统")
		fmt.Print("请输入选项:")
		_, err := fmt.Scanln(&key)
		if err != nil {
			fmt.Println("未知错误:", err, "\t请重新输入")
		}
		switch key {
		case "add":
			_, err := fmt.Scanln(&val)
			if err != nil {
				fmt.Println("未知错误:", err, "\t请重新输入")
			} else {
				err = queue.addQueue(val)
				if err != nil {
					fmt.Println(err)
				}
			}
		case "get":
			val, err := queue.getQueue()
			if err != nil {
				fmt.Println(err)
			}
			fmt.Println(val)
			fmt.Println()
		case "show":
			queue.showQueue()
		case "exit":
			os.Exit(0)
		}
	}
}

环形队列的增删

package main

import (
	"errors"
	"fmt"
	"os"
)

const (
	maxSize = 4
)

type CircleQueue struct {
	head    int
	tail    int
	maxSize int
	array   [maxSize]string
}

func (this *CircleQueue) Push(val string) (err error) {
	if this.IsFull() {
		return errors.New("queue is fulled...")

	}
	this.array[this.tail] = val
	this.tail = (this.tail + 1) % this.maxSize
	return
}
func (this *CircleQueue) Pop() (val string, err error) {
	if this.IsEmpty() {
		return "", errors.New("queue is empty...")
	}
	val = this.array[this.head]
	this.head = (this.head + 1) % this.maxSize
	return val, nil
}
func (this *CircleQueue) IsFull() (bol bool) {
	return (this.tail+1)%this.maxSize == this.head
}
func (this *CircleQueue) IsEmpty() (bol bool) {
	return this.head == this.tail
}
func (this *CircleQueue) Size() (size int) {
	return (this.tail + this.maxSize - this.head) % this.maxSize
}

func (this *CircleQueue) ListQueue() (err error) {
	if this.IsEmpty() {
		return errors.New("queue is empty...")
	}
	var end int
	if this.head > this.tail {
		end = this.tail + this.maxSize
	} else {
		end = this.tail
	}
	for i := this.head; i < end; i++ {
		fmt.Println(i%this.maxSize, this.array[i%this.maxSize])
	}
	return
}

func main() {
	CircleQueue := CircleQueue{maxSize: maxSize, head: 0, tail: 0}

	for {
		var key string
		var val string
		fmt.Println("1、输入add  添加对列")
		fmt.Println("2、输入get  获取对列")
		fmt.Println("3、输入show 显示对列")
		fmt.Println("4、输入exit 退出系统")
		fmt.Print("请输入选项:")
		_, err := fmt.Scanln(&key)
		if err != nil {
			fmt.Println("未知错误:", err, "\t请重新输入")
		}
		switch key {
		case "add":
			_, err := fmt.Scanln(&val)
			if err != nil {
				fmt.Println("未知错误:", err, "\t请重新输入")
			} else {
				err = CircleQueue.Push(val)
				if err != nil {
					fmt.Println(err)
				}
			}
		case "get":
			val, err := CircleQueue.Pop()
			if err != nil {
				fmt.Println(err)
			}
			fmt.Println(val)
			fmt.Println()
		case "show":
			err := CircleQueue.ListQueue()
			if err != nil {
				fmt.Println(err)
			}
		case "exit":
			os.Exit(0)
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值