赞
踩
队列是一个有序列表,可以用数组或者链表来实现。
遵循先进先出的原则。也就是说,添加数据的时候从队列尾部添加,取数据的时候从队列首部开始取。
模拟图:
maxSize指的是队列容量大小,也就是能存储多少个元素。
front 指向队列头部第一个元素的前一个元素,初始值我们假设为 -1
rear指向队列尾部最后一个元素元素,初始值我们假设为为 -1
我们做环形的思路是,当rear>maxSize时,此时重新设置为0,rear+1是预留一个位置,不牺牲这个位置会导致无法判断队列是否为空或满。
(rear+1)%maxSize=foont,此时可判断已满(满)
怎么理解呢?
现在不是之前的原数组,当容量满了之后就不再添加数据,现在是一个环形的数组,满了之后从头开始加。
此时:(需要在队列后面空出一个位置 所以此时队列容量大小为maxSize-1)
maxSize指的是队列容量大小,也就是能存储多少个元素。
front 指向队列头部第一个元素。
rear(初始值0)指向队列尾部最后一个元素的后一个位置(空留出来的)元素。
(rear+1)%maxSize=fount(0),此时可判断已满(满),也可做为当队列头有空位的时候,rear+1取模之后变为0 又开始循环。。--------也就是说此时的rear=(rear+1)%maxSize
下面是代码实现:
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): 查看队列头的数据"); System.out.println(); key = scanner.next().charAt(0);// 接收一个字符 switch (key) { case 's': queue.showQueue(); break; case 'a': System.out.println("输出一个数"); int value = scanner.nextInt(); queue.addQueue(value); break; case 'g': // 取出数据 try { int res = queue.getQueue(); System.out.printf("取出的数据是%d\n", res); } catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } break; case 'h': // 查看队列头的数据 try { int res = queue.headQueue(); System.out.printf("队列头的数据是%d\n", res); } catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } break; case 'e': // 退出 scanner.close(); loop = false; break; default: break; } } System.out.println("程序退出~~"); }
参考:https://blog.csdn.net/oneby1314/article/details/107584566
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。