数据结构队列

首先明确一下队列的概念.

队列是一种有序列表,使用数组的结构来存储队列的数据.

队列是一种先进先出的算法.由前端加入,由后端输出.

如下图:

​ 第一个图 第二个图 第三个图

这就是队列的形状.

他的本体是一个空空的数组(Queue)加上两个指在同一个位置的指针(rear,front).

这个数组有长度的限制(因为是java算法,所以数组长度有限制,必须在声明时就写出他的大小.)

于是我们看到了上面的情况,如果要加入元素就移动后面的指针(rear),如果要获取(退出)元素就把前面的指针移动(front).

于是我们可以产生这样的一个思路.

  1. front永远指向队列中第一个值
  2. rear永远指向队列中最后一个值
  3. 当rear==front的时候队列为空(理解不了就看一眼第一个图)
  4. 移动front是从队中删除元素
  5. 移动rear是从队中添加元素

由此我们可以写出代码:

第一部分是创建一个队列.(与稀疏数组一样,第一步都是创建这个数据结构)

class ArrayQueue{
private int maxSize;//表示数组的最大容量
private int front;//队列头
private int rear;//队列尾
private int arr[];//该数据用于存放数据,模拟队列
}

如上几个就是构建队列所需要的资源

但是这个资源有一个值必须由外部来给定,那就是maxSize.

所以构造函数如下:

//创建队列的构造器
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
arr=new int[maxSize];
front=-1;//只想对队列头部,分析出front是指向队里的头的*前一个位置*
rear=-1;//指向队列尾的数据(即就是队列最后的一个数据)
}

由此我们就可以构建出一个队列了

但是一个队列并没有什么用,我们还要操作这个家伙.

如果我们要构造加入队列的功能,思路一般是构造一个循环,而这个循环的停止条件则是应该是队列满

就必须要有判断队列是否满的功能.

ISFULL


//看图就知道,当rear指到最后一个的时候合格就无法继续添加了
public boolean isFull() {
return rear==maxSize-1;
}

addQueue:加入队列功能.根据上面说过的内容,rear指针向后移动就是像队列中加入元素.

如果满了,就必须阻止这个加入步骤.

  public void addQueue(int a){
//判断队列不为空
if(isFull()){
System.out.println("队列满,不能加入数据");
return;
}
//加入数据
rear++;//让rear后移
arr[rear]=a;//赋值
}

构建完了增加模块,我们就要构造获取模块了.

和增加模块一样,获取模块也准备由两个函数构成.

我们也要担心一下这个是不是空的,要组织获取不存在得数值.

我们知道,当rear==front的时候,这个队列就回到了最初的状态,里面为空.

ISEMPTY

public boolean isEmpty(){
return rear==front;
}

由此我们就只要构建一个获取模块函数可以了,用ISEMPTY来阻止取出不存在的值

public int getQueue(){
if (isEmpty()){
System.out.println("栈空了!");
// return -1;这个不行,因为这样的话,只能返回-1
throw new RuntimeException("队列空。");
}
front++;
return arr[front];
}

这就是队列的主要功能了.

但是要想观察整个队列中有的元素,总不能挨个退出来之后再挨个加上去吧!

那就必须重写一个函数了.

正好,因为队列是数组,所以我们只要遍历数组就能得到其中全部的数据,当然这个只是为了让你搞清楚这个队列的结构以及其中的内容,看一下即可.因为它会将队列用过的所有结点都打印出来.

//显示队列的所有数据
public void showQueue(){
if (isEmpty()){
System.out.println("队列是空的。");
}
for (int i = 0; i <arr.length ; i++) {
System.out.printf("arr[%d]=%d\n",i,arr[i]); //这个要学习一下。
//标准化输出解决输出的值是空值的问题。
}
}

还有一个办法,就是发现头节点.

//显示队列头数据,注意不是取出数据
public int headQueue(){
if (isEmpty()){
System.out.println("队列空的,没有数据");
throw new RuntimeException("队列是空的");
}
return arr[front+1];//因为队列头front永远指的是队列中的第一个数的前面一个
}

下面是全部得代码

package queue;

//import jdk.nashorn.internal.parser.Scanner;

import java.util.Scanner;

public class ArrayQueueDemo {
public static void main(String[] args) {
//测试一下
//创建一个队列
ArrayQueue arrayQueue = new ArrayQueue(3);
char key=' ';//接受用户的输入
Scanner scanner = new Scanner(System.in);
boolean loop=true;
//输出一个菜单
while(loop){
System.out.println("s:显示队列");
System.out.println("e:退出程序");
System.out.println("a:添加数据到队列");
System.out.println("g:从队列取出数据");
System.out.println("h:查看队列头的数据");
// System.out.println("s:显示队列");
key=scanner.next().charAt(0);
switch (key){
case 's':
arrayQueue.showQueue();
break;
case 'a':
System.out.println("输出一个数");
int value=scanner.nextInt();
arrayQueue.addQueue(value);
arrayQueue.showQueue();
break;
case 'g'://取出数据
try {
int res=arrayQueue.getQueue();
System.out.printf("取出的数据是%d\n,",res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'h'://查看队列头的数据
try {
System.out.println( arrayQueue.headQueue());
}catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'e'://退出
scanner.close();
loop=false;
break;
default:
break;
}
}
System.out.println("程序退出~~~时");
}
}
//编写一个叫做ArrayQueue的类
class ArrayQueue{
private int maxSize;//表示数组的最大容量
private int front;//队列头
private int rear;//队列尾
private int arr[];//该数据用于存放数据,模拟队列
//创建队列的构造器
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
arr=new int[maxSize];
front=-1;//只想对队列头部,分析出front是指向队里的头的*前一个位置*
rear=-1;//指向队列尾的数据(即就是队列最后的一个数据)
}
//判断队列是否满
public boolean isFull() {
return rear==maxSize-1;
}
//判断队列是否为空
public boolean isEmpty(){
return rear==front;
}
//添加数据到队列
public void addQueue(int a){
//判断队列不为空
if(isFull()){
System.out.println("队列满,不能加入数据");
return;
}
//加入数据
rear++;//让rear后移
arr[rear]=a;//赋值
}
//获取队列的值
public int getQueue(){
if (isEmpty()){
System.out.println("栈空了!");
// return -1;这个不行,因为这样的话,只能返回-1
throw new RuntimeException("队列空。");
}
front++;
return arr[front];
}
//显示队列的所有数据
public void showQueue(){
if (isEmpty()){
System.out.println("队列是空的。");
}
for (int i = 0; i <arr.length ; i++) {
System.out.printf("arr[%d]=%d\n",i,arr[i]); //这个要学习一下。
//标准化输出解决输出的值是空值的问题。
}
}
//显示队列头数据,注意不是取出数据
public int headQueue(){
if (isEmpty()){
System.out.println("队列空的,没有数据");
throw new RuntimeException("队列是空的");
}
return arr[front+1];//因为队列头front永远指的是队列中的第一个数
}
}

java算法--普通队列的更多相关文章

  1. java算法--循环队列

    循环队列 我们再用队列得时候不知道发没发现这样一个问题. 这是一个只有三个位置得队列,在进行三次加入(addqueue)操作和三次取出(get)操作之后再进行加入操作时候的样子.明显可以看到,队列已经 ...

  2. java算法-单向队列

    队列是一种:先进先出,后进后出的数据结构 单项队列: 从前面删除元素,从后面插入元素,跟现实中排队是一样的道理 这里我们用指针移动位置的方法.因为数组删除元素,如果我们要跟现实中排队效果一样,就需要移 ...

  3. Java实现 蓝桥杯 算法提高 队列操作

    算法提高 队列操作 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 队列操作题.根据输入的操作命令,操作队列(1)入队.(2)出队并输出.(3)计算队中元素个数并输出. 输入格式 ...

  4. Java多线程 阻塞队列和并发集合

    转载:大关的博客 Java多线程 阻塞队列和并发集合 本章主要探讨在多线程程序中与集合相关的内容.在多线程程序中,如果使用普通集合往往会造成数据错误,甚至造成程序崩溃.Java为多线程专门提供了特有的 ...

  5. java算法--稀疏数组

    数据结构必要知识 线性结构 线性结构是最常用的数据结构,数据元素之间存在一对一的线性关系. 线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构.顺序存储的线性表称为顺序表,顺序表中的存储元素是 ...

  6. JAVA算法系列 冒泡排序

    java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...

  7. JAVA算法系列 快速排序

    java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...

  8. java算法 蓝桥杯 乘法运算

    问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...

  9. java算法 蓝桥杯 扶老奶奶街

    一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...

随机推荐

  1. plsql登录,tables表为空解决方案

    共两种方法,第一种不行,再试下第二种: 第一种: plsql tables 表存在,但是看不到所有的表信息 将C:\Windows\Prefetch目录下,几个PLSQL DEVELOPER***** ...

  2. Sampling Error|Sampling mean|population mean

    7.1 Sampling Error; the Need for Sampling Distributions 样本均值的三种表达: Sampling distribution of the samp ...

  3. CPU时间分片、多线程、并发和并行

    1.CPU时间分片.多线程? 如果线程数不多于CPU核心数,会把各个线程都分配一个核心,不需分片,而当线程数多于CPU核心数时才会分片. 2.并发和并行的区别 并发:当有多个线程在操作时,如果系统只有 ...

  4. c socket 开发测试

    c语言异常 参照他人代码写一个tcp的 socket 开发测试 异常A,在mac osx系统下编译失败,缺库转到debian下. 异常B,include引用文件顺序不对,编译大遍异常 异常C,/usr ...

  5. ZOJ-1163-The Staircases

    dp[i][j]表示i个砖头构成的最高台阶不高于j的楼梯数目 Accepted 1163 C++11 0 2280 #include "bits/stdc++.h" using n ...

  6. 史上最全Java面试题全集

    2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对 ...

  7. SpringMVC学习笔记一:采用注解式搭建简单springMVC环境

    搭建的环境使用的是maven项目 项目目录树: 搭建环境使用的jar包,pom.xml文件 <project xmlns="http://maven.apache.org/POM/4. ...

  8. JS数字千分

    JS数字千分: 1.例子:1000--->1,000 2.实现如下: salesToFormat: function (num) { var num = (num || 0).toString( ...

  9. 转:zabbix 2.0.6监控cisco交换机 2950 2960s 3560G

    转自: http://blog.chinaunix.net/uid-24250828-id-3806551.html 想在zabbix 上监控交换机端口的流量,找了两天的模板,包括官方的和网友写的.在 ...

  10. Ubuntu18.04安装OpenStack

    Ubuntu18.04 安装Queens版本OpenStack 安装环境 系统 系统使用的是Ubuntu18,最少4核8G内存,20G硬盘空间. 工具 devstack DevStack是一系列可扩展 ...