java中用数组实现环形队列的示例代码

2025-05-29 0 40

本篇文章主要讲述了使用数组实现环形队列的思路以及具体代码

一、队列是什么

我们先来看下百科的解释:
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头
总结起来两点:
1.一种线性表
2.添加操作只能在表尾,删除操作在表头(先进先出)

二、实现队列的思路

1.初始化一个空队列

初始化一个大小固定的数组,并将头指针,尾指针都指向下表为0的位置,但其实这种初始化头指针指向的是队首,尾指针指向的是队尾的后一个元素。

java中用数组实现环形队列的示例代码

2.往队列里添加元素

往队列里添加元素,尾指针后移一位。

java中用数组实现环形队列的示例代码

一直添加直到队列满

java中用数组实现环形队列的示例代码

这个时候尾指针已经出现在数组下标外了

3.消费队列元素

每消费一个队列元素,头指针指向的元素出队,并且后移一位

java中用数组实现环形队列的示例代码

再消费两个

java中用数组实现环形队列的示例代码

这个时候我们想往队列里继续添加元素,尾指针后移,然后发现出现了假溢出的情况,因为尾指针无法再向后移动,而队列实际上并没有满,我们又无法继续往队列里添加数据。这个时候其实有两种解决方案。
方案一:我们每消费一个元素,其后面的元素都整体往前移动一位,就像我们生活中排队打饭一样,后面的人都往前挪一挪。但这种方案带来的后果是,带来的时间开销太大,因为基本上要操作所有的元素,所以这种方案不可行。
方案二:尾指针在指向下表为最后一个元素时,再添加元素,如果还有空位,就将尾指针重新指向0,头指针在取到下表数组末尾时,如果前面还有元素,头指针也指向0,这就是我们说的环形队列

三、实现环形队列

1.环形队列示例图

尾指针重新指向零

java中用数组实现环形队列的示例代码

再添加一个元素

java中用数组实现环形队列的示例代码

连续消费三个元素,如果前面还有元素,头指针也指向0

java中用数组实现环形队列的示例代码

这个时候我们发现那个原来熟悉的队列又回来了。

2.代码实现

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102
/**

* description:数组实现环形队列

* author: xiaowang

* */

public class myqueue<e> {

// 队列最大个数

private int size;

// 元素真实个数

private int number;

// 头指针,指向队列的第一个元素即队头

private int front;

// 尾指针,指向队尾的后一个元素(非队尾)

private int rear;

// 队列具体值

private object[] values;

// 队列满标记,当队列是满的时候为true

private boolean isfullflag;

/**构造器*/

public myqueue(int size){

if (size<0){

throw new runtimeexception("初始化队列时,队列最大元素个数不能为负");

}

this.front = 0;

this.rear = 0;

this.number = 0;

this.isfullflag = false;

this.size = size;

this.values = new object[size];

}

/**往队列里添加元素 添加成功返回true 失败返回false*/

public boolean addtoqueue(e e){

// 判断队列是否已经满了

if (isfullflag){

system.out.println("队列已满,无法继续添加元素");

return false;

}

// 添加元素

values[rear] = e;

// 元素个数加一

number++;

// 尾指针后移一位,若已经指向数组最后的下表,则重新指向0

if (rear == size-1){

rear = 0;

}else{

rear++;

}

// 添加完这个元素,判断队列是否已经满了,若满则标记为true

if (rear==front){

isfullflag = true;

}

return true;

}

/**从队列里取出数据,队头数据*/

public e getfromqueue(){

// 判断队列是否为空

if (number==0||size==0){

system.out.println("队列为空,无法从队列中获取数据");

return null;

}

// 临时变量

e e = (e) values[front];

// 队头置空

values[front] = null;

// 个数减一

number--;

// 头指针后移,若已经指向数组最后的下表,则重新指向0

if (front==size-1){

front = 0;

}else {

front++;

}

// 取队列之前若是满的状态,则更新状态

if (isfullflag){

isfullflag = false;

}

return e;

}

/**获取目前有几个元素正在进行排队*/

public int getnumber(){

return number;

}

/**获取队列的最大个数*/

public int getsize(){

return size;

}

/**查看队列在数组里保存的详细情况*/

public string tostring(){

stringbuffer valuestr = new stringbuffer();

valuestr.append("[");

for (int i = 0; i < size; i++) {

if (i!=size-1){

valuestr.append(values[i]+",");

}else{

valuestr.append(values[i]+"]");

}

}

return valuestr.tostring();

}

}

测试代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40
public class testqueue {

public static void main(string[] args) {

myqueue<string> queue = new myqueue<string>(5);

scanner scanner = new scanner(system.in);

scanner scanner2 = new scanner(system.in);

boolean iscan = true;

while (iscan){

system.out.println("欢迎来到小王排队系统,您可以使用以下功能。\\n添加:1;取出:2;展示:3;获取排队个数:4;退出:0。");

int flag = scanner.nextint();

switch (flag){

case 1 :

system.out.println("请输入一个数据:");

string data = scanner2.nextline();

boolean issuccess = queue.addtoqueue(data);

if (issuccess){

system.out.println("添加成功~~~");

}

break;

case 2 :

string datafromqueue = queue.getfromqueue();

if (datafromqueue!=null){

system.out.println("本次取出的数据为:"+datafromqueue);

}

break;

case 3 :

system.out.println("队列详情为:\\n"+queue.tostring());

break;

case 4 :

system.out.println("目前有"+queue.getnumber()+"个元素正在进行排队");

break;

default:

iscan = false;

system.out.println("已退出...");

break;

}

}

}

}

总结

到此这篇关于java中用数组实现环形队列的示例代码的文章就介绍到这了,更多相关java 数组环形队列内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!

原文链接:https://blog.csdn.net/qq_45661812/article/details/115662181

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 java中用数组实现环形队列的示例代码 https://www.kuaiidc.com/107934.html

相关文章

发表评论
暂无评论