码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构学习(队列)

时间:2019-12-10 22:19:23      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:ann   接收   default   void   queue类   exti   package   列表   链表   

队列:是一个有序列表,可以用数组和链表实现,遵循先进先出的原则
数组模拟队列:
队列本身是有序列表,需要两个变量front和rear分别记录前后端下标
front随着数据输出而改变,rear随着数据输入而改变

将数据存入队列:
1.将队尾指针后移, rear+1,当front == rear (空)
2.若尾指针rear小于最大下标maxSize - 1,则将数据存入rear所指的数组元素中 当 rear==maxSize-1(队列满)


数组模拟环形队列:
1. 尾索引的下一个为头索引时表示队列满,即将队 列容量空出一个作为约定
2. 这个在做判断队列满的时候需要注意 (rear + 1) % maxSize == front [满]
rear == front [空]

 

package cn.imut;
//队列

import java.util.Scanner;

/**
 *              5|       |  ---> rear
 *              4|       |
 *              3|       |
 *              2|       |
 *              1|       |
 *              0|       |
 *                          ---> front
 *
 */
public class ArrayQueueDemo {
    public static void main(String[] args) {
        //创建一个队列
        ArrayQueue arrayQueue = new ArrayQueue(3);
        char key = ‘ ‘;         //接收用户输入
        Scanner sc = new Scanner(System.in);
        boolean loop = true;
        //输出一个菜单
        while(loop){
            System.out.println("s(show): 显示队列");
            System.out.println("e(exit): 退出程序");
            System.out.println("a(add): 添加数据到队列");
            System.out.println("g(get): 从队列取出数据");
            System.out.println("h(head): 查看队列头的数据");
            key = sc.next().charAt(0);          //接收一个字符
            switch (key){
                case ‘s‘:
                    arrayQueue.showQueue();
                    break;
                case ‘a‘:
                    System.out.println("输入一个数");
                    int value = sc.nextInt();
                    arrayQueue.addQueue(value);
                    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{
                        int res = arrayQueue.headQueue();
                        System.out.printf("队列头的数据是%d\n", res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case ‘e‘:
                    sc.close();
                    loop = false;
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出!");
    }
}

//使用数组模拟队列-->编写一个ArrayQueue类
class ArrayQueue{
    private int maxSize;        //表示数组最大容量
    private int front;          //队列头
    private int rear;           //队列尾
    private int[] arr;          //该数组用于存储数据,模拟队列
    /*
    *           取数据时front改变,加数据时rear改变
    *           在循环队列中,为了判断队列满和队列空的情况,对队列少用一个元素空间,使头指针指向队头元素的前一个位置,当尾指针等于该位置时就表示队满。
    */
    //创建队列的构造器
    public ArrayQueue(int arrMaxSize){
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        front = -1;         //指向队列头部,分析出front是指向队列头前一个位置                                        front:前面的
        rear = -1;          //指向队列尾部,分析出rear是指向队列尾部(即就是队列最后一个数据)                          rear:后面的
    }

    //判断队列是否满
    public boolean isFull(){
        return rear == maxSize - 1;         //存入数组,下标从0开始
    }

    //判断队列是否为空
    public boolean isEmpty(){
        return rear == front;               //正常来说 front>rear
    }

    //添加数据到队列
    public void addQueue(int n){
        //判断队列是否已满
        if(isFull()){
            System.out.println("队列已满!");
            return;
        }
        rear++;     //让rear后移
        arr[rear] = n;
    }

    //获取队列的数据,出队列
    public int getQueue(){
        //判断队列是否为空
        if(isEmpty()){
            //通过抛出异常
            throw new RuntimeException("队列为空,不能取数据");
        }
        front++;    //头指针向后移动
        return arr[front];
    }

    //显示队列的所有数据
    public void showQueue(){
        //遍历
        if(isEmpty()){
            System.out.println("队列为空,没有数据...");
            return;
        }
        for(int i = 0; i < arr.length; i++){
            System.out.printf("arr[%d]=%d\n", i, arr[i]);
        }
    }

    //显示队列的头数据(不是取数据)
    public int headQueue(){
        //判断
        if(isEmpty()){
            throw new RuntimeException("队列为空,没有数据...");
        }
        return arr[front + 1];
    }
}

 

数据结构学习(队列)

标签:ann   接收   default   void   queue类   exti   package   列表   链表   

原文地址:https://www.cnblogs.com/yfyyy/p/12019262.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!