数据结构与算法之队列

队列

  • 概念:队列是一个有序列表,可以用数组或者链表进行实现
    遵循先入先出的原则
  • 用数组模拟队列:用数组模拟时需要定义maxSize该队列的最大容量,队列的输出输入分别从前后端进行处理,因此需要定义 front 和 rear 变量就队列前后端下标,front随着数据的输出而改变 rear随着数据的输入而改变
  • 原理图如下在这里插入图片描述
    注意:在向队列添加数据时需要判断队列是否已满 在获取数据时需要判断队列是否为空
直接用数组模拟队列
  • 直接使用数组模拟队列时:front表示队列第一个元素的前一个位置 front =-1,rear表示队列的最后一个元素位置rear=-1 判断队列是否为满的条件是 rear= =maxSize-1 判断数据是否为空的条件是 front= =rear 并且是一次性的队列,不能循环存储数据
  • 使用循环队列:在这里插入图片描述
    1、front指向队列的第一个元素,即arr[front] 就表示队列的第一个元素front的初始值front=0;
    2、rear指向队列的最后一个元素的后一个位置,剩下一个空间作为一个约定,rear的初始值为0
    3、当队列满时,条件是(rear+1)%maxSize=front
    4、当队列为空时 rear= = front
    5、这样规定下,队列中的有效数据个数(rear+maxSize-front)%maxSize
    6、在上面的一次性队列中修改为 环形队列
    7、代码实现
 //写一个模拟循环队列的类
class CricleQueue{
   private int maxSize;//表示队列的最大值
   private int front ;//表示队列的第一个元素 初始值为0
   private int rear;//表示队列最后元素的后一个位置,初始值为0
   private int[] arr;//表示存储的数据
   
   //创建一个构造方法 来初始化数据
   public CricleQueue(int maxSize){
   	this.maxSize=maxSize;
   	this.arr=new int[maxSize];
   	this.front=0;
   	this.rear=0;
   }
   
   //判断该队列是否满了
   public boolean isFull(){
   	
   	return (rear+1)%maxSize==front;
   }
   
   //判断队列是否为空
   public boolean isEmpty(){
   	
   	return rear==front;
   }
   //向队列中添加元素
   public void addQueue(int num){
   	//判断队列是否为满
   	if(isFull()){
   		System.out.println("队列已经满了~");
   		return;
   	}
   	arr[rear]=num;
   	rear=(rear+1)%maxSize;//取余用来将rear 后移
   }
   
   //获取队列中的数据
   public int getQueue(){
   	//判断队列是否为空
   	if(isEmpty()){
   		//抛出异常
   	    throw	new  RuntimeException("队列为空~");
   	}
   	//由于front指向的是队列的第一个元素
   	//1、将获取的值存储到临时变
   	//2、将front后移
   	//3、将值进行返回
   	int vale=arr[front];
   	front=(front+1)%maxSize;
   	return vale;
   }
   
   //显示队列中的元素
   public void showQueue(){
   	for(int i=front;i<front+size();i++){
   		System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
   	}
   }
   
   //返回队列的队首元素
   public int headQueue(){
   	if(isEmpty()){
   		throw new RuntimeException("队列为空~");
   	}
   	return arr[front];
   }
   //计算队列中的元素数量
   public int size(){
   	return (rear+maxSize-front)%maxSize;
   }
   
}

8、测试代码

    public class CricleQueueDemo {

	public static void main(String[] args) {
		
		//进行测试
		//创建一个队列
		CricleQueue queue=new CricleQueue(4);
		//接收用户输入
		char key=' ';
		Scanner sc=new Scanner(System.in);
		boolean loop=true;
		//输出一个菜单
		while(loop){
			System.out.println("a(add):添加一个元素");
			System.out.println("g(get):获取一个元素");
			System.out.println("h(head):获取队首元素");
			System.out.println("s(show):显示所有的队列中元素");
			System.out.println("e(exit):退出程序");
			//接收用户输入 单个字符
			key=sc.next().charAt(0);
			switch (key) {
			case 'a':
				System.out.println("请输入一个数字:");
				queue.addQueue(sc.nextInt());
				break;
			case 'g':
				try {
					int vale = queue.getQueue();
					System.out.println("取出的数据是: "+vale);
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case 'h':
				try {
					int value = queue.headQueue();
					System.out.println("队首的元素是:" +value);
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case 's':
				queue.showQueue();
				break;
			case 'e':
				loop=false;
				System.out.println("程序退出了~");
				break;
			default:
				break;
			}
		}
		
	}
	
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值