Java数组模拟队列

文章目录

    • 1. 数组模拟队列
    • 2. 数组模拟环形队列

1. 数组模拟队列

  • 缺点

数组不能复用

package com.cds.queue;

import java.util.Scanner;

public class QueueArray {
	public static void main(String[] args) {		
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入队列的长短");
		int maxSize = sc.nextInt();
		Queuearr queue = new Queuearr(maxSize);
		boolean flag = true;
		char key = ' ';
		while(flag) {
			System.out.println("-----meau-------");
			System.out.println("s-show:输入s打印队列");
			System.out.println("a-add:输入a添加数据");
			System.out.println("g-get:输入g弹出一个数据");
			System.out.println("h-head:输入h获取头数据");
			System.out.println("e-exit:输入e退出");
			System.out.println("---------------");
			//接受一个字符
			key = sc.next().charAt(0);
			switch (key) {
			case 's':
				queue.showQueue();
				break;
			case 'a':
				System.out.println("请输入要添加的数字");
				try {
					int data = sc.nextInt();
					queue.add(data);
				} catch (Exception e) {
					e.printStackTrace();
				}
				break;
			case 'g':
			System.out.println(queue.getQueue());
				break;
			case 'h':
				queue.headQueue();
				break;	
			case 'e':
				flag = false;
				break;
			default:
				break;	
			}
			
		}
		System.out.println("成功推出");
		
	}

}


class Queuearr{
	private int maxSize;
	private int fornt;
	private int rear;
	private int[] arr;
	
	public Queuearr(int maxSize) {
		this.maxSize = maxSize;
		//指向队列头前一个元素【不包含】
		this.fornt = -1;	
		//指向队列尾的最后一个元素【包含】
		this.rear = -1;
		arr = new int[maxSize];
	}
	
	public boolean isEmpty() {
		return fornt == rear;
	}
	
	public boolean isFull() {
		return fornt == maxSize - 1;
	}
	
	public void add(int data) {
		if(isFull()) {
			System.out.println("队列已满,不可添加元素");
		}
		arr[++rear] = data;

	}
	
	public int getQueue() {
		if(isEmpty()) {
			throw new RuntimeException("队列为空,无可弹出元素");
		}
		fornt++;
		return arr[fornt];
	}
	
	public void showQueue() {
		if(isEmpty()) {
			System.out.println("队列为空,无元素");
		}else {
			for (int i = 0; i < arr.length; i++) {
				System.out.printf("%d\t",arr[i]);
			}
			System.out.println();
		}
		
	}
	
	public int headQueue() {
		if(isEmpty()) {
			throw new RuntimeException("数组为空");
		}
		return arr[fornt+1];
	}
	
}

2. 数组模拟环形队列

package com.cds.queue;

import java.util.Scanner;

public class CircleArrayQueue {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入队列的长短");
		int maxSize = sc.nextInt();
		circleArrayQueueDemo queue = new circleArrayQueueDemo(maxSize);
		boolean flag = true;
		char key = ' ';
		while(flag) {
			System.out.println("-----meau-------");
			System.out.println("s-show:输入s打印队列");
			System.out.println("a-add:输入a添加数据");
			System.out.println("p-pop:输入p弹出一个数据");
			System.out.println("h-head:输入h获取头数据");
			System.out.println("e-exit:输入e退出");
			System.out.println("---------------");
			//接受一个字符
			key = sc.next().charAt(0);
			switch (key) {
			case 's':
				queue.showQueue();
				break;
			case 'a':
				System.out.println("请输入要添加的数字");
				int data = sc.nextInt();
				try {
					queue.add(data);
				} catch (Exception e) {
					e.printStackTrace();
				}
				break;
			case 'p':
			System.out.println(queue.pop());
				break;
			case 'h':
				queue.getHead();
				break;	
			case 'e':
				flag = false;
				break;
			default:
				break;	
			}
			
		}
		
		
		
		
	}
}

class circleArrayQueueDemo{
	private int head;
	private int tail;
	private int maxSize;
	private int[] arr;
	
	public circleArrayQueueDemo(int maxSize) {
		this.maxSize = maxSize;
		arr = new int[maxSize];
		head = tail = 0;
	}
	
	/**
	 * 判断队列是否为空
	 */
	public boolean isEmpty() {
		return head == tail;
	}
	
	/**
	 * 判断队列是否满了
	 */
	public boolean isFull() {
		return (tail + 1) % maxSize == head;
	}
	
	/**
	 * 给队列中添加元素
	 */
	public void add(int data) {
		if(isFull()) {
			System.out.println("队列已满,无法添加");
			return;
		}else {
			arr[tail] = data;
			tail = (tail +1	) % maxSize;
		}
		
	}
	
	/**
	 * 从队列中取出元素
	 */
	public int pop() {
		if(isEmpty()) {
			System.out.println("队列为空");
			throw new RuntimeException();
		}
		int tmp = arr[head];
		head = (head + 1) % maxSize;
		return tmp;
	}
	
	/**
	 * 队列有效数据个数
	 */
	public int size() {
		return (tail - head + maxSize) % maxSize;
	}
	
	/**
	 * 遍历打印数组
	 */
	public void showQueue() {
		if(isEmpty()) {
			System.out.println("队列为空");
			return;
		}
		for (int i =head; i < head + size(); i++) {
			System.out.printf("a[%d]=%d、",i % maxSize ,arr[i % maxSize]);
		}
		System.out.println();

	}
	
	public int getHead() {
		if(isEmpty()) {
			System.out.println("队列为空,没有头元素");
			throw new RuntimeException();
		}
		return arr[head];
	}
	
	
}

你可能感兴趣的:(#,Java研发修养)