欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

三种队列(线性队列、循环队列、动态队列)

程序员文章站 2022-07-09 19:10:28
...
   队列
   1.线性队列
   2.循环队列
   3.动态队列

队列接口

public interface Queue {
    void put(char a);
    char get();
    void show();
}

线性队列

//线性队列
public class Queue1 implements Queue {
    private int i;
    private int j;
    private char[] arr;
    Queue1(int size){
        arr = new char[size];
        i = j = 0;
    }
    @Override
    public void put(char a) {
        if(a == ' '){
            System.out.println("该元素非法");
        }else if(i == arr.length) {
            System.out.println("线性队列已满,添加元素失败!");
        }else arr[i++] = a;

    }

    @Override
    public char get() {
        if(j == arr.length) {
            System.out.println("线性队列无元素,获取元素失败!");
            return '-';
        }else {
            char b = arr[j];
            arr[j++] = ' ';
            return b;
        }
    }

    @Override
    public void show() {
        System.out.println("线性队列元素为:");
        for(char v:arr){
            System.out.println(v + "\t\t");
        }
        System.out.println("————————————————————————");
    }
}

循环队列

//循环队列
public class Queue2 implements Queue{
    private int i;
    private int j;
    private char[] arr;
    Queue2(int size){
        arr = new char[size];
        i = j = 0;
    }
    @Override
    public void put(char a) {
        if (a == ' ') {
            System.out.println("该元素非法");
        }else {
            if (i == arr.length) {
                i = 0;
            }
            arr[i++] = a;
        }
    }

    @Override
    public char get() {
        if (i == arr.length) {
            j = 0;
        }
        char b = arr[j];
        arr[j++] = ' ';
        return b;
    }

    @Override
    public void show() {
        System.out.println("循环队列元素为:");
        for(char v:arr){
            System.out.println(v + "\t\t");
        }
        System.out.println("————————————————————————");
    }
}

动态队列

import java.util.ArrayList;
import java.util.Arrays;

//动态队列,自动扩展
public class Queue3 implements Queue{
    private int i;
    private int j;
    private char[] charArr;
    private ArrayList<Character> charArraylist;
    private char[] newArr;
    Queue3(int size){
        charArr = new char[size];
        i = j = 0;
    }
    @Override
    //charArr出队更新 ---> newArr出队更新
    public void put(char a) {
        if (a == ' ') {
            System.out.println("元素非法");
        }else{
            if(i < charArr.length){
                charArr[i++] = a;//如果未超过原数组长度,则无需扩展,不需要ArrayList
            }else{
                if (i == charArr.length){//表示第一个超过数组长度的字符进入队列,创建扩展ArrayList
                charArraylist = new ArrayList<Character>();
                for(int m = 0;m < charArr.length;m++){//将原长度的数组内容添加到ArrayList中,出队后更新在charArr中
                    charArraylist.add(Character.valueOf(charArr[m]));
                }
                charArraylist.add(Character.valueOf(a));//将新入队的元素也添加到ArrayList中
                }else{//表示不是第一此扩展队列
                    charArraylist.clear();//先将原ArrayList的元素清除,这是为了动态更新数组,保证出队更新
                    for(int m = 0;m < newArr.length;m++){//重新将newArr中的元素添加在ArrayList中
                        charArraylist.add(Character.valueOf(newArr[m]));
                    }
                    charArraylist.add(Character.valueOf(a));
                }
                //i按照数字顺序逐一递增,所以以下程序在第一个超长度元素入队之后执行第一次,将ArrayList中的元素转化为Char[]
                Object[] newC = charArraylist.toArray();
                Character[] newChar = Arrays.copyOf(newC,newC.length,Character[].class);
                newArr = new char[newChar.length];
                for(int m = 0 ;m < newChar.length;m++){
                    newArr[m] = newChar[m].charValue();
                }
                i++;
            }
        }
    }

    @Override
    public char get() {
        char b;
        if(i-1 < charArr.length){
            b = charArr[j];
            charArr[j++] = ' ';
        }else{
            b = newArr[j];
            newArr[j++] = ' ';
        }
        return b;
    }

    @Override
    public void show() {
        System.out.println("动态队列元素为:");
        if(i-1 < charArr.length){
            for(char v:charArr){
                System.out.println(v + "\t\t");
            }
        }else{
            for(char v:newArr){
                System.out.println(v + "\t\t");
            }
        }
        System.out.println("————————————————————————");
    }
}

main方法

public class QueueDemo {
    public static void main(String[] args) {
        Queue1 q1 = new Queue1(4);
        q1.put('1');
        q1.put('2');
        q1.put('3');
        q1.put('4');
        q1.show();
        System.out.println("取出:" + q1.get());
        q1.show();
        q1.put('5');
        q1.put(' ');


        Queue2 q2 = new Queue2(4);
        q2.put('a');
        q2.put('b');
        q2.put('c');
        q2.put('d');
        q2.show();
        System.out.println("取出:" + q2.get());
        q2.show();
        q2.put('e');
        q2.show();


        Queue3 q3 = new Queue3(4);
        q3.put('9');
        q3.put('8');
        q3.put('7');
        q3.put('6');
        q3.show();

        q3.put('5');
        q3.show();
        System.out.println("取出:" + q3.get());
        q3.show();

        q3.put('4');
        q3.show();
        q3.put('4');
        q3.show();
        System.out.println("取出:" + q3.get());
        q3.show();
    }
}