前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构与算法——队列

数据结构与算法——队列

作者头像
C you again 的博客
发布2020-09-15 14:38:29
3330
发布2020-09-15 14:38:29
举报

本篇介绍队列的定义、队列的实现方式(数组实现队列,链表实现队列),如果你需要了解其他数据结构,请点击下面链接查看!!!

了解更多:数据结构与算法目录整理

队列

一、队列的定义

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。

二、队列的实现方式(顺序存储于链式存储)

1)队列的基本操作及其说明

方法名

返回值

参数类型

说明

isFull()

boolean

判断队列是否为满

isEmpty()

boolean

判断队列是否为空

add(int data)

void

int

向队列中添加元素

getOne()

int

从队列中去除元素

getHead()

int

获取头部元素

getQueue()

List

获取队列元素

size()

int

获取队列中元素的个数

2)队列的数组实现

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import javax.management.RuntimeErrorException;

/**
 *  *队列的数组实现
 * @author 蜡笔小新
 *
 */
public class Test3 {

	public static void main(String []args) {
		 boolean temp=true;
		 ArrQueue arrQueue=new ArrQueue(3);
		 while(temp) {
			 System.out.println("isFull:队列是否为满");
			 System.out.println("isEmpty:队列是否为空");
			 System.out.println("add:添加元素");
			 System.out.println("getOne:获取元素");
			 System.out.println("getHead:获取头部元素");
			 System.out.println("getQueue:获取队列");
			 System.out.println("size:获取队列中元素的个数");
			 System.out.println("exit:退出程序");
			 System.out.println("输入你的操作命令:");
			 Scanner scanner=new Scanner(System.in);
			 String str=scanner.nextLine();
			switch(str) {
			    case "isFull":
			    	System.out.println(arrQueue.isFull());
			    	break;
			    case "isEmpty":
			    	System.out.println(arrQueue.isEmpty());
			    	break;
			    case "add":
			    	System.out.println("输入要添加的数据:");
			    	int n=scanner.nextInt();
			    	arrQueue.add(n);
			    	break;
			    case "getOne":
					try {
						int m = arrQueue.getOne();
						System.out.println(m);
					} catch (Exception e) {
						System.out.println(e.getMessage());
					}
			    	break;
			    case "getHead":
			    	try {
						int s=arrQueue.getHead();
						System.out.println(s);
					} catch (Exception e) {
						// TODO: handle exception
						System.out.println(e.getMessage());
					}
			    	break;
			    case "getQueue":
			    	try {
						System.out.println(arrQueue.getQueue());
					} catch (Exception e) {
						// TODO: handle exception
						System.out.println(e.getMessage());
					}
			    	break;
			    case "size":
			    	System.out.println(arrQueue.size());
			    	break;
			    case "exit":
			    	temp=false;
			    	break;
			    default:
			    	System.out.println("输入有误");
			    	break;
			 }
		 }
		 System.out.println("程序退出!");
	}
	
}

class ArrQueue{
	private int maxSize; //队列的最大容量
	private int front; //队列头
	private int rear; //队列尾
	private int []arr; //模拟队列
	
	public ArrQueue(int maxSize) {
		this.maxSize=maxSize;
		front=-1; //指向头部的前一个位置
		rear=-1; //指向尾部的位置
		arr=new int[maxSize]; //初始化数组
	}
	
	//判断队列是否为空
	public boolean isEmpty() {
		return front==rear;
	}
	//判断队列是否为满
	public boolean isFull() {
		return rear==maxSize-1;
	}
	
	//向队列中添加元素
	public void add(int data) {
		if(isFull()) {
			System.out.println("队列已满");
			return ;
		}
		arr[++rear]=data;
	}
	//从队列中去除元素
	public int getOne() throws Exception{
		if(isEmpty()) {
			throw new Exception("队列为空");
		}
		
	  return arr[++front];
		
	}
	//size()	int	无	获取队列中元素的个数
	//getHead()	int	无	获取头部元素
	public int getHead() throws Exception {
		if(isEmpty()) {
			throw new Exception("队列为空");
		}
	  return arr[front+1];
	}
	
	//获取队列元素
	public List getQueue() {
		if(isEmpty()) {
			throw new RuntimeException("队列为空");
		}
		List list=new ArrayList<>();
		for(int i=front+1;i<=rear;i++) {
			list.add(arr[i]);
		}
		return list;
	}
	
	//获取队列元素个数
	public int size() {
		if(isEmpty()) {
			return 0;
		}
		return rear+1;
	}
}

运行结果:

在这里插入图片描述
在这里插入图片描述

以上就是队列的数组实现,但是我们发现以上方法只能使用一次,无法做到复用的效果,因此对以上代码进行修改如下:

对以上程序中的 getOne()方法进行修改

代码语言:javascript
复制
//从队列中去除元素
	public int getOne() throws Exception{
		if(isEmpty()) {
			throw new Exception("队列为空");
		}
		
	  int t=arr[++front];
	  if(isEmpty()) {
		  front=rear=-1;
	  }
	  else {
		  for(int i=front+1;i<=rear;i++) {
			  arr[i-1]=arr[i];
		  }
		  front--;
		  rear--;
	  }
	  return t;
		
	}

3)队列的链表实现

正在神速整理中。。。。。敬请期待

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 了解更多:数据结构与算法目录整理
  • 队列
    • 一、队列的定义
      • 二、队列的实现方式(顺序存储于链式存储)
        • 1)队列的基本操作及其说明
        • 2)队列的数组实现
        • 3)队列的链表实现
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档