队列

顺序队列和循环对列

一.基本概念

队列是一个有序列表,可以用数组和链表实现,遵循先入先出的原则

front 队首,指向第一个数据前一位,默认值为-1;

rear 队尾,指向队列最后一个数据,默认值为-1;

maxSize 数组最大长度;

二.顺序队列

入队rear+1;出队front+1;

队列为空:front=rear;

队列满: rear=maxSize-1;

其缺点为无法循环使用;

代码实例:

package com.datestructs;

import java.util.Scanner;

public class Test01 {

public static void main(String[] args) {
	queue a=new queue(3);
	
	boolean flag=true;
	while(flag) {
		Scanner cin=new Scanner(System.in);
		System.out.print("a增加元素"+" ");
		System.out.print("s输出所有元素"+" ");
		System.out.print("r获取数组数据"+" ");
		System.out.println("h获取头数据"+" ");
		System.out.println("请输入你的选择");
		String str=cin.next();
		switch(str) {
		case "a":
			System.out.println("请输入数据");
			int c=cin.nextInt();
			a.addQueue(c);
			break;
		case "s":
			a.show();
			break;
		case "r":
			int y=a.readQueue();
			System.out.println(y);
			break;
		case "h":
			System.out.println(a.hand());
			break;
			
		}
		System.out.println("是否继续进行操作,继续y,退出n");
		String str1=cin.next();
		if(str1.equals("y"))
			flag=true;
		else
			//cin.close();
			flag=false;
	}

}

}
class queue{
private int maxSize;//数组的最大长度
private int real;//队尾,指向队列的最后一个元素
private int front;//队首,指向队列的最前元素的前一位
int[] num;//定义一个数组

	public queue(int x) {
		this.real=-1;
		this.front=-1;
		this.maxSize=x;
		num=new int[maxSize];
	}
	
//判断队列是否满
public boolean isFull() {
	return real==maxSize-1;
}
//判断队列是否空
public boolean isEmpty() {
	return real==front;
}
//添加数据到队列,入队
public void addQueue(int x) {
	if(isFull()) {
		System.out.println("该数组已满");
		return;
	}
	real++;
	num[real]=x;
		
}
//获取队列中的数据,出队
public int readQueue() {
	if(isEmpty())
		
	     throw new RuntimeException("队列为空");
	front++;
	return num[front];
}
//显示队列里的所有数据
public void show() {
	if(isEmpty())
		throw new RuntimeException("队列为空");
	for(int i=0;i<num.length;i++) {
	System.out.println(num[i]);
	}
}
//获取队列头数据
public int hand() {
	if(isEmpty()) {
		throw new RuntimeException("队列为空");
	}
	return num[front+1];
}

}

二.循环队列

front 指向队列第一个元素,默认值为0;

rear 指向队列最后一个元素的下一位,预留了一个空间

队列为空:front=rear

队列已满:(rear+1)%maxSize=front;

队列中有效元素个数: (raea+maxSize-front)%maxSize;

代码实例

package com.datestructs;

import java.util.Scanner;

public class Test02 {

public static void main(String[] args) {
	circleQueue a=new circleQueue(5);
	Scanner cin=new Scanner(System.in);
	boolean flag=true;
	while(flag) {
		
		System.out.print("a增加元素"+" ");
		System.out.print("s输出所有元素"+" ");
		System.out.print("r获取数组数据"+" ");
		System.out.println("h获取头数据"+" ");
		System.out.println("n退出");
		System.out.println("请输入你的选择");
		char str=cin.next().charAt(0);
		switch(str) {
		case 'a':
			System.out.println("输入要增加的数");
			int b=cin.nextInt();
			a.add(b);
			break;
		case 's':
			a.show();
			break;
		case 'r':
			System.out.println(a.read());
			break;
		case 'h':
			System.out.println(a.head());
			break;
		case 'n':
			flag=false;
			break;
		}
	}
	System.out.println("已退出");

}

}
class circleQueue{
private int maxSize;
private int front;//队首,默认为0
private int rear;//队尾,指向最后一个元素的下一个位置
private int[] arr;//定义一个数组用来实现环形队列

public circleQueue(int max) {
maxSize=max;
arr=new int[maxSize];
front=0;
rear=0;

}
public boolean isFull() {
return (rear+1)%maxSizefront;
}
public boolean isEmpty() {
return front
rear;
}
//队列中增加一个元素
public void add(int x) {
if(isFull())
System.out.println(“队列已满”);
arr[rear]=x;
rear=(rear+1)%maxSize;
}
//出队
public int read() {
if(isEmpty())
System.out.println(“队列为空”);
int value=front;
front=(front+1)%maxSize;
return arr[value];
}
//输出队列中所有元素
public void show() {
if(isEmpty())
System.out.println(“队列为空”);
for(int i=front;i<front+number();i++) {
System.out.println(arr[i%maxSize]);
}
}
//获取队列的头元素
public int head() {
if(isEmpty())
System.out.println(“队列为空”);
return arr[front];
}

//判断队列中有效元素的个数
public int number() {
return (rear+maxSize-front)%maxSize;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值