队列
- 队列是一个有序列表,其特点是先入先出,即先进队列的元素先出队列。
数组模拟队列
- 队列只能使用一次,没有实用价值。
- 使用数组模拟此队列时,需要定义四个属性:
(1)arr[ ]:数组,用于存放队列中的元素
(2)maxSize:int,用于规定队列的最大长度
(3)front:int,arr[front+1]始终为队列的第一个元素
(4)rear:int,arr[rear]始终表示队列中最后一个元素 - 先进先出实现:每次添加一个元素,都添加到arr[rear+1]位置上;每次取出一个元素,都取arr[front+1]。
- 代码:
import java.util.Scanner;
public class ArrayQueue {
public static void main(String[] args) {
Queue<String> q = new Queue<String>(3);
char key = ' ';
Scanner scan = new Scanner(System.in);
boolean loop = true;
while(loop) {
System.out.println("p(print):\t打印队列");
System.out.println("e(exit): \t退出程序");
System.out.println("a(add): \t添加数据到队列");
System.out.println("g(get): \t从队列取数据");
System.out.println("h(head): \t显示队列头元素");
key = scan.next().charAt(0);
switch(key) {
case 'p':
q.printQueue();
break;
case 'a':
System.out.println("请输入一个元素:");
String element = scan.next();
q.addElement(element);
break;
case 'g':
try {
String e = q.getElement();
System.out.println("取出的元素为:" + e);
}catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'h':
try {
String e = q.headElement();
System.out.println("队列头元素为:" + e);
}catch(Exception e) {
System.out.println(e.getMessage());
}
break;
case 'e':
scan.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序运行结束。");
}
}
class Queue<E>{
private Object[] arr;
private int maxSize;
private int front;
private int rear;
public Queue(int size) {
maxSize = size;
arr = new Object[maxSize];
front = -1;
rear = -1;
}
public boolean isFull() {
return rear == (maxSize-1);
}
public boolean isEmpty() {
return front == rear;
}
public void addElement(E num) {
if(isFull()) {
System.out.println("队列已满,无法添加元素");
return;
}
rear++;
arr[rear] = num;
}
public E getElement() {
if(isEmpty()) {
throw new RuntimeException("队列为空,无法获取数据");
}
front++;
return (E)arr[front];
}
public void printQueue() {
if(isEmpty()) {
System.out.println("队列为空");
return;
}
int first = front + 1;
for(int i=first; i<=rear; i++) {
System.out.print(arr[i] + "\t");
}
System.out.println();
}
public E headElement() {
if(isEmpty()) {
throw new RuntimeException("队列为空,没有内容。");
}
return (E)arr[front+1];
}
}
环形队列实现
- 设定
(1)arr[ ]:使用数组保存环形队列中的元素
(2)maxSize:环形队列的最大长度
(3)front:arr[front]始终表示队列的第一个元素
(4)rear:arr[rear]始终表示队列中最后一个元素的后一个位置,这个位置永远是空的,因此导致了队列的最大长度为maxSize,但队列中元素个数最多为 maxSize-1 个 - 有设定可知
(1)当条件满足(rear+1)%maxSize = front 时,队列满。
(2)当条件满足 rear = front 时, 队列为空。
(3)队列中的数据个数为:(rear+maxSize-front)%maxSize。 - 队列中每个位置都可重复使用,但队列中的空间无法被完全使用,始终会有一个位置空着。
- 代码实现:
import java.util.Scanner;
public class CircleQueue {
public static void main(String[] args) {
CirQueue<String> q = new CirQueue<String>(3);
char key = ' ';
Scanner scan = new Scanner(System.in);
boolean loop = true;
while(loop) {
System.out.println("p(print):\t打印队列");
System.out.println("e(exit): \t退出程序");
System.out.println("a(add): \t添加数据到队列");
System.out.println("g(get): \t从队列取数据");
System.out.println("h(head): \t显示队列头元素");
key = scan.next().charAt(0);
switch(key) {
case 'p':
q.printQueue();
break;
case 'a':
System.out.println("请输入一个元素:");
String element = scan.next();
q.addElement(element);
break;
case 'g':
try {
String e = q.getElement();
System.out.println("取出的元素为:" + e);
}catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'h':
try {
String e = q.headElement();
System.out.println("队列头元素为:" + e);
}catch(Exception e) {
System.out.println(e.getMessage());
}
break;
case 'e':
scan.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序运行结束。");
}
}
class CirQueue<T>{
private Object[] arr;
private int maxSize;
private int front;
private int rear;
public CirQueue(int size) {
maxSize = size;
arr = new Object[maxSize];
front = 0;
rear = 0;
}
public boolean isFull() {
return ((rear+1)%maxSize) == front;
}
public boolean isEmpty() {
return front == rear;
}
public void addElement(T element) {
if(isFull()) {
System.out.println("队列已满,元素添加失败。");
return;
}
arr[rear] = element;
rear = (rear+1)%maxSize;
}
public T getElement() {
if(isEmpty()) {
throw new RuntimeException("队列为空,没有数据。");
}
T value = (T)arr[front];
front = (front+1)%maxSize;
return value;
}
public int length() {
return (rear+maxSize-front) % maxSize;
}
public void printQueue() {
if(isEmpty()) {
System.out.println("队列为空,没有数据。");
return;
}
for(int i=front; i<(front+length()); i++) {
int index = i%maxSize;
System.out.println("arr[" + index + "]=" + arr[index]);
}
}
public T headElement() {
if(isEmpty()) {
throw new RuntimeException("队列为空。");
}
return (T)arr[front];
}
}