队列的模拟思路

队列为一个有序列表,是先进先出的
使用数组来实现环形队列
设计思路:
(1) 首先,创建一个数组,长度为maxSize ,来设置两个节点,一个头节点front指向第一个元素、一个尾节点rear指向最后一个元素的后一个位置,初始化为0
(2) 在添加数据时,需要判断队列是否满;在获取数据时,需要判断队列是否空。 添加数据和获取数据时,分别操纵的是rear,front。
(3) 判断队列满: (rear+1) % maxSize = front 
(4) 判断对列空: front == rear
(5) 此时队列中的有效数据为: (rear + maxSize - front) % maxSize`
import java.util.Scanner;

public class ArrayTraQueue {
	public static void main(String[] args){
		arrayQueue queue = new arrayQueue(4);// 有效数据为3
		Scanner input = new Scanner(System.in);
		char key = ' ';
		boolean loap = true;
		
		while(loap){
			System.out.print("a : 添加数据\n");
			System.out.print("g : 获取数据\n");
			System.out.print("h : 查看头节点数据\n");
			System.out.print("s : 遍历队列数据\n");
			System.out.print("e : 退出程序\n");
			System.out.printf("请选择操作:");
			key = input.next().charAt(0);
			
			switch(key){
				case 'a': // 添加数据
					Scanner n = new Scanner(System.in);
					System.out.print("请输入一个数:");
					int sum = n.nextInt();
					queue.addQueue(sum);
					break;
				case 'g': // 获取数据
					try{
						int num = queue.getQueue();
						System.out.println("取到数据为:" + num);
					}catch(Exception e){
						System.out.println(e.getMessage());
					}	
					break;
				case 'h': // 查看头节点
					int num1 = queue.peekQueue();
					System.out.println("当前头节点数据为:" + num1);
					break;
				case 's': // 遍历队列
					queue.showQueue();
					break;	
				case 'e':
					System.out.println("程序即将退出...");
					break;
				default :
					break;
			}
		}
		
		System.out.println("程序退出...");
	}
}

class arrayQueue{
	private int MaxSize; // 队列的最大容量
	private int front; // 队头节点
	private int rear; // 队尾节点
	private int[] arr; // 数组
	
	public arrayQueue(){
		
	}
	public arrayQueue(int maxsize){ // 初始化队列
		MaxSize = maxsize;
		front = 0;
		rear = 0;
		arr = new int[MaxSize];
	}
	// 判断队列是否为空
	public boolean isEmpty(){
		return front == rear;
	}
	// 判断队列是否已满
	public boolean isFull(){
		return (rear+1)%MaxSize == front;
	}
	
	// 添加数据
	public void addQueue(int n){
		if (isFull()){
			System.out.println("队列已满,不能继续添加!!!");
			return;
		}
		arr[rear] = n;
		// 取模运算
		rear = (rear+1) % MaxSize;
		System.out.println("添加成功...");
	}
	
	// 获取数据
	public int getQueue(){
		if (isEmpty()){
			throw new RuntimeException("队列为空");
		}
		// 这里front需要后移,取模
		int value = arr[front];
		front = (front + 1) % MaxSize;
		return value;
	}
	
	// 查看队头节点数据
	public int peekQueue(){
		if (isEmpty()){
			throw new RuntimeException("队列为空");
		}
		return  arr[front];
	}
	
	// 遍历队列
	public void showQueue(){
		if (isEmpty()){
			System.out.printf("队列为空\n");
			return;
		}
		// 从头节点开始,到目前队列中的有效数据
		int size = (rear + MaxSize - front) % MaxSize;
		for (int i=front; i<(front + size); i++){
			System.out.printf("arr[%d]: %d\n", i % MaxSize, arr[i % MaxSize]);
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值