java使用数组模拟实现简单的队列

首先定义一个接口

package com.RoundQueue;
public interface IQueue {
    
    
	//判断队空
	boolean isEmpty();
	//判断队满
	boolean isFull();
	//入队					
	void add(Object data);
	//出队
	void delete();
	//打印
	void print();
}

实现接口

package com.RoundQueue;
import java.util.Scanner;
public class MyQueue implements IQueue {
    
    
	private int maxSize;// 队的最大容量
	private int head, tail;// 头尾指针
	private Object[] queue;// 队列数组
	private int counter;// 记录队里的元素个数
	/**
	 * 直接利用构造方法初始化队列
	 * 
	 * @param maxSize
	 */
	public MyQueue(int maxSize) {
    
    
		super();
		this.maxSize = maxSize;
		this.head = 0;
		this.tail = 0;
		this.counter = 0;
		this.queue = new Object[maxSize];
	}
	/**
	 * 判断队空
	 */
	@Override
	public boolean isEmpty() {
    
    
		return counter == 0;
	}
	/**
	 * 判断队满
	 */
	@Override
	public boolean isFull() {
    
    
		// 元素个数判满可以完全利用数组空间,头尾指针判满有一个位置是不能被利用的
		return counter == maxSize;
	}
	/**
	 * 入队
	 */
	@Override
	public void add(Object data) {
    
    
		if (isFull()) {
    
    
			System.out.println("队已满,此元素无法入队");
			return;
		}
		queue[tail] = data;
		// 求余可以实现循环入队
		tail = (tail + 1) % maxSize;
		counter++;
		System.out.println("元素[" + data + "]入队成功");
	}
	/**
	 * 出队
	 */
	@Override
	public void delete() {
    
    
		if (isEmpty()) {
    
    
			System.out.println("队已空,无元素出队");
			return;
		}
		int data = head;
		// 出队不用删除元素,直接循环移动头指针的位置就可以了
		// queue[head]=null;//删掉元素也没毛病
		head = (head + 1) % maxSize;
		counter--;
		System.out.println("元素[" + queue[data] + "]出队成功");
	}
	/**
	 * 打印
	 */
	@Override
	public void print() {
    
    
		if (isEmpty()) {
    
    
			System.out.println("队列已空,无法输出数据。");
		} else if (isFull()) {
    
    
			if (head == 0) {
    
    // 头指针在尾指针前面
				for (int i = 0; i < maxSize; i++) {
    
    
					System.out.print(queue[i] + " ");
				}
			} else {
    
    // 循环入队后,尾指针在头指针前面
				for (int i = head; i < maxSize; i++) {
    
    
					System.out.print(queue[i] + " ");
				}
				for (int i = 0; i < head; i++) {
    
    
					System.out.print(queue[i] + " ");
				}
			}
		} else {
    
    // 队里有元素但不是满的
			for (int i = head; i < (head + (tail + maxSize - head) % maxSize); i++) {
    
    
				System.out.print(queue[i % maxSize] + " ");
			}
		}
		System.out.println();
	}
	public int getMaxSize() {
    
    
		return this.maxSize;
	}

}

建立一个测试类

package com.RoundQueue;
public class QueueTest {
    
    
	public static void main(String[] args) {
    
    
		MyQueue queue = new MyQueue(5);
		queue.print();
		queue.add(0);
		queue.add(1);
		queue.add(2);
		queue.add(3);
		queue.add(4);
		queue.print();
		queue.delete();
		queue.delete();
		queue.delete();
		queue.print();
		queue.add(1);
		queue.add(2);
		queue.add(2);
		queue.print();
		queue.delete();
		queue.add("b");
		queue.print();
	}
}

菜单

package com.zhaojun.test0925.tasklist.RoundQueue;
import java.util.Scanner;
public class Index {
    
    
	/**
	 * 初始化一个队列
	 */
	static MyQueue initQueue() {
    
    
		int len;
		MyQueue queue;
		do {
    
    
			Scanner sc = new Scanner(System.in);
			System.out.println("输入一个整数");
			try {
    
    

				len = sc.nextInt();
				queue = new MyQueue(len);
				System.out.println("您有一个长度为" + queue.getMaxSize() + "的队");
				break;
			} catch (Exception e) {
    
    
				System.out.println("输入整数有误");
			}
		} while (true);
		return queue;
	}
	/**
	 * 菜单
	 */
	public static void meanu() {
    
    
		MyQueue queue = Index.initQueue();
		meanuHome(queue);
	}
	/**
	 * @param queue
	 */
	public static void meanuHome(MyQueue queue) {
    
    
		System.out.println("----队列系统-----");
		String tip = "** 1.入队\r\n** 2.出队\r\n** 3.查看\r\n** 0.退出";
		System.out.println(tip);
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		switch (num) {
    
    
		case 1:
			System.out.println("输入入队元素");
			Object data = sc.next();
			queue.add(data);
			meanuHome(queue);
			break;
		case 2:
			queue.delete();
			meanuHome(queue);
			break;
		case 3:
			System.out.print("队里的元素有:");
			queue.print();
			meanuHome(queue);
			break;
		default:
			System.out.println("退出");
			break;
		}
	}
	public static void main(String[] args) {
    
    
		meanu();
	}
}

猜你喜欢

转载自blog.csdn.net/xiaozhaozai/article/details/120483703