数据结构和算法-数组模拟队列实现|学习笔记

简介: 快速学习数据结构和算法-数组模拟队列实现

开发者学堂课程【Go 语言核心编程 - 数据结构和算法: 数据结构和算法-数组模拟队列实现】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/627/detail/9832


数据结构和算法-数组模拟队列实现

 

内容简介:

一、代码实现

二、代码总结


一、代码实现

(1)数组模拟入队列代码实现

首先打开  VSCode ,在 chapter20 文件夹中新建一个文件称为 singlequeue ,再在其内新建一个文件称为 main.go ,

并输入以下代码:

package main

import (

fmt

os

errors

)

//使用一个结构体管理队列

type Queue struct {

maxSize int

array [5]int //数组 =>模拟队列(因为光有这个没有用,光有数组没有操作,它就真的只是个数字,只有当这个数组被注入了或者加入了关联的方法,才能变成了一个队列。

数组它是一种数据类型,等到给它的做一些操作的时候,它就变成了一种结构或者算法)

front int  //表示指向队列首

rear int  //表示指向队列的尾部

}

//添加数列到队列

fFunc (this *Queue) AddQueue(val int) (err error) {

//先判断队列是否已满

if rear == maxSize - 1 { //重要的提示: rear 是队列的尾部(最后的元素)

return errors.New(queue full)

}

this.rear++  //rear 后移

this.array[this.rear] = val

return

}

//显示队列,找到队首,然后遍历到队尾

func (this *Queue) ShowQueue() {

fmt.Println(队列当前的情况是:)

//this.front不包含队首的元素

for i := this.front + 1;i <= this.rear;i++ {

fmt.Printf(array[%d]=%d\t,i,this.array[i])

}

fmt.Println()

}

//编写一个主函数的测试,测试

func main() {

//先创建一个队列

queue := &Queue{

maxSize : 5,

front : -1,

rear : -1,

}

var key string

var val int

for {

fmt.Println(1.输入 add 表示添加数据到队列)

fmt.Println(2.输入 get 表示从队列获取数据)

fmt.Println(3.输入 show 表示显示队列)

fmt.Println(4.输入 exit 表示显示队列)

fmt.Scanln(&key)

switch key {

case add :

fmt.Println(输入你要到队列数)

fmt.Scanln(&val)

err := queue.AddQueue(val)

if err != nil {

fmt.Println(加入队列ok)

} else {

fmt.Println(err.Error())

}

case get:

fmt.Println(get)

case show

queue.ShowQueue()

case exit:

os.Exit(0)

}

}

}

将代码保存退出后,运行以上代码,运行结果如下:

D:\goproject\src\go_code\chapter20\sparsearray>cd ..

D:\goproject\src\go_code\chapter20>cd singlequeue

D:\goproject\src\go_code\chapter20\singlequeue>dir

驱动器 D 中的卷是新加卷

卷的序列号是 D2AD-BC9F

D:\goproject\src\go_code\chapter20\singlequeue 的目录

08  10:25    <DIR>

08  10:25    <DIR>

08  10:45             1.664 main.go

1个文件             1.664 字节

2个目录  46.411.534.336  可用字节

D:\goproject\src\go_code\chapter20\singlequeue>go run main.go

1. 输入 add 表示添加数据到队列

2. 输入 get 表示从队列获取数据

3. 输入 show 表示显示队列

4. 输入 exit 表示显示队列

add

输入你要的队列数

1

panic : runt ine error: invalid memory address or nil gointer dereference

[signal 0xc0000005 code-oxo addr-0x20 pc-0x4a4598]

gorout ine 1 [running]:

main.main<>

D/goproject/src/go_code/chapter20/singlequeue/main.go:67 +0x488

exit status 2

(2)对以上代码修改及运行

运行结果表示在上文输入的代码的67行出现了问题,将其修改为以下形式:
if err != nil {

fmt.Println(err.Error())

} else {

fmt.Println(加入队列ok)

} 

再次运行代码,运行结果为:

D:\goproject\src\go_code\chapter20\singlequeue>go run main.go

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

add

输入你要的队列数

1

加入队列 ok

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

show

队列当前的情况是:

array[0]=1  array[1]=2

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

add

输入你要入队列数

3

加入队列 ok

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

add

输入你要入队列数

4

加入队列 ok

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

add

输入你要入队列数

5

加入队列 ok

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

show

队列当前的情况是:

array[0]=1  array[1]=2  array[2]=3  array[4]=5

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

add

输入你要入队列数

6

queue full

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

show

队列当前的情况是:

array[0]=1  array[1]=2  array[2]=3  array[4]=5

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

(3)增添出队列的代码实现

现在有了入队列的代码之后,再在上文代码中加一段代码出队列的代码,

添加以下代码:

//从队列中取出数据

func (this *Queue) GetQueue() (val int,err error) {

//先判断队列是否为空

if this.rear == this.front {  //队空

return  -1,errors.New(queue empty)

}

this.front++

val = this.array[this.front]

return val,err

}

再将上文代码的最后一部分修改为以下代码:

fmt.Scanln(&key)

switch key {

case add :

fmt.Println(输入你要到队列数)

fmt.Scanln(&val)

err := queue.AddQueue(val)

if err != nil {    

} else {

fmt.Println(err.Error())

}

case get:

val, err := queue.GetQueue()

if err != nil {

fmt.Println(err.Error())

} else {

Fmt.Println(从队列中取出一个数=, val)

}

case show

queue.ShowQueue()

case exit:

os.Exit(0)

}

}

}

再运行以上代码,运行结果为:

D:\goproject\src\go_code\chapter20\singlequeue>go run main.go

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

show

队列当前的情况是:

add

输入你要入队列数

1

加入队列 ok

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

add

输入你要入队列数

2

加入队列 ok

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

show

队列当前的情况是:

array[0]=1  array[1]=2

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

get

从队列中取出了一个数 = 1

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

show

队列当前的情况是:

array[1]=2

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show表示显示队列

4.输入 exit 表示显示队列

add

输入你要入队列数

3

加入队列 ok

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

show

队列当前的情况是:

array[1]=2  array[2]=3

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

add

输入你要入队列数

4

加入队列 ok

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

show

队列当前的情况是:

array[1]=2  array[2]=3  array[3]=4

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

get

从队列中取出了一个数 = 2

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

get

从队列中取出了一个数 = 3

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

show

队列当前的情况是:

array[3]=4

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

add

输入你要入队列数

5

加入队列 ok

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

show

队列当前的情况是:

array[3]=4  array[4]=5

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

add

输入你要入队列数

6

queue full

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

get

从队列中取出了一个数 = 4

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

show

队列当前的情况是:

array[4]=5

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

get

从队列中取出了一个数 = 5

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

get

queue empty

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

add

输入你要入队列数

90

queue full

1.输入 add 表示添加数据到队列

2.输入 get 表示从队列获取数据

3.输入 show 表示显示队列

4.输入 exit 表示显示队列

 

二、代码总结

现在,第一个单项的队列已经实现了,现在想一个问题,现在虽然已经实现了所谓的一个队列结构,但是它的问题是比较严重的,什么问题?

就是没有办法去复用队列的数组空间,因为到最后的时候是这样一个情况,

如下图:

image.png

对以上代码的小结和说明有以下两点:①上面代码实现了基本队列结构,但是没有有效的利用数组空间②请思考,如何使用数组实现一个环形的队列。

相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
69 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
32 4
|
1月前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
1月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
20 0
|
17天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
91 9
|
8天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
16 1
|
10天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
13天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
15天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
43 4
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
30 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器