好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java数据结构与算法数组模拟队列示例详解

一、什么是队列

队列是一个有序列表,可以用数组或者链表来实现。 遵循先入先出的原则,即:先存入队列的数据,要先取出。后存入的的数据,后取出。

看一张队列的模拟图,1,2,3表示同一个队列Queue。在队列中有2个指针,front表示队首,rear表示队尾。

图1中表示队列里还没有数据,所以front跟rear初始化都是-1。 当图2中有数据进行存入的时候,front没变,而rear则随着数据的增多而改变。存入了4个数据,于是rear=3。 再看图3,front变成了2,rear没有变化,因为前面的2个数据被依次先取出,所以队首就变成了2。

这就是队列的[先进先出]了。

二、用数组来模拟队列

思路也比较简单,因为队列的输出、输入是分别从前后端来处理,因此需要两个变量front以及rear分别记录队列的前后端下标。

front会随着数据输出而改变,而rear则是随着数据的输入而改变。

?

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

103

104

105

106

107

108

109

110

111

112

113

114

115

116

package sparsearray;

import java.util.Scanner;

public class MyArrayQueue {

     public static void main(String[] args) {

         // 创建一个队列

         ArrayQueue arrayQueue = new ArrayQueue( 3 );

         char key = ' ' ; //接受用户输入

         Scanner scanner = new Scanner(System.in);

         boolean loop = true ;

         // 输出一个菜单

         while (loop) {

             System.out.println( "s(show): 显示队列" );

             System.out.println( "e(exit): 退出程序" );

             System.out.println( "a(add): 添加数据到队列" );

             System.out.println( "g(get): 从队列取出数据" );

             System.out.println( "h(head): 显示队首的数据" );

             key = scanner.next().charAt( 0 ); // 接收一个字符

             switch (key) {

                 case 's' :

                     arrayQueue.showQueue();

                     break ;

                 case 'a' :

                     System.out.println( "请要添加的数" );

                     int value = scanner.nextInt();

                     arrayQueue.addQueue(value);

                     break ;

                 case 'g' :

                     try {

                         int res = arrayQueue.getQueue();

                         System.out.printf( "取出的数据是:%d" , res);

                     } catch (Exception e) {

                         System.out.println(e.getMessage());

                     }

                     break ;

                 case 'h' :

                     try {

                         int headValue = arrayQueue.showHeadQueue();

                         System.out.printf( "队首数据是:%d" , headValue);

                     } catch (Exception e) {

                         System.out.println(e.getMessage());

                     }

                     break ;

                 case 'e' :

                     scanner.close();

                     loop = false ;

                     break ;

             }

         }

         System.out.println( "退出程序" );

     }

}

// 把队列抽象成一个类,ArrayQueue

class ArrayQueue {

     //表示数组最大容量

     private int maxSize;

     // 队列头

     private int front;

     // 队列尾

     private int rear;

     // 用于存放数据的数组

     private int [] arr;

     // 构造器

     public ArrayQueue( int arrMaxSize) {

         maxSize = arrMaxSize;

         arr = new int [maxSize];

         front = - 1 ; // 指向队首的前一个位置

         rear = - 1 ; // 指向队列尾部,包括队列最后的这个数据

     }

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

     public boolean isFull() {

         return rear == maxSize - 1 ; // 注意这里的 maxSize-1 为什么要减1

     }

     // 判断队列是否为空

     public boolean isEmpty() {

         return rear == front;

     }

     // 添加数据到队列

     public void addQueue( int num) {

         // 判断队列是否满了

         if (isFull()) {

             System.out.println( "队列已满,不可加入数据" );

             return ;

         }

         rear++; // 让rear后移

         arr[rear] = num;

     }

     // 拿出队列数据

     public int getQueue() {

         // 判断队列是否空

         if (isEmpty()) {

             // 抛出异常

             throw new RuntimeException( "队列为空,不可取数据" );

         }

         front++; // front后移

         return arr[front];

     }

     // 显示队列所有数据

     public void showQueue() {

         // 遍历

         if (isEmpty()) {

             System.out.println( "队列为空" );

             return ;

         }

         for ( int i = 0 ; i < arr.length; i++) {

             System.out.printf( "arr[%d]=%d\n" , i, arr[i]);

         }

     }

     // 显示队里的队首数据

     public int showHeadQueue() {

         if (isEmpty()) {

             // 抛出异常

             throw new RuntimeException( "队列为空,不可取数据" );

         }

         return arr[front + 1 ]; // 注意这里为甚么要+1,因为指向队首的前一个位置

     }

}

可以用代码分别的进行各项操作,看起来似乎没问题。

但是,实际是有问题。

这里创建的数组使用一次就不能接着用了,比如把数据取完后,再往里加数据就不行了。

所以要对其进行优化,使用算法,将其改成一个环形队列,以上就是java数据结构与算法数组模拟队列示例的详解内容,更多关于java数据结构算法数组模拟队列的资料请关注其它相关文章!

原文链接:https://HdhCmsTestcnblogs测试数据/pingguo-softwaretesting/p/14509117.html

查看更多关于java数据结构与算法数组模拟队列示例详解的详细内容...

  阅读:16次