1. 程式人生 > 實用技巧 >Spark SQL(4)-Unresolved Plan到Analyzed Plan

Spark SQL(4)-Unresolved Plan到Analyzed Plan

1、簡介

1)佇列是一個有序列表,可以用陣列或者連結串列來實現

2)遵循先進先出的規則,即先進隊的先出隊

2、陣列模擬佇列

陣列模擬佇列的程式碼實現:

front:指向隊頭的前一個數據

rear:指向隊尾

/**
 * @author houChen
 * @date 2020/7/26 10:09
 * @Description:   使用陣列來模擬佇列
 */
public class ArrayQueueDemo {
    public static void main(String[] args) {
        ArrayQueue queue =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:檢視佇列頭的資料"); key=scanner.next().charAt(0); switch (key){ case 's': queue.showQueue(); break; case 'a': System.out.print("輸入一個數:"); int value = scanner.nextInt(); queue.addQueue(value);
break; case 'g': try { queue.getQueue(); } catch (Exception e) { System.out.printf(e.getMessage()); } break; case 'h': try { int v= queue.headQueue(); System.out.printf("從隊頭取出的元素為:%d",v); } catch (Exception e) { System.out.printf(e.getMessage()); } break; case 'e': scanner.close(); loop=false; break; } System.out.println(); } System.out.println("程式退出~~"); } } class ArrayQueue{ private int maxSize; //表示陣列的最大容量 private int front; //佇列頭 private int rear; //佇列尾 private int[] array; //存放資料 // 建立佇列的構造器 public ArrayQueue(int maxSize) { this.maxSize = maxSize; array =new int[maxSize]; front=-1; rear = -1; } // 判斷佇列是否為滿 public boolean isFull(){ return rear == maxSize-1; } // 判斷佇列是否為空 public boolean isEmpty(){ return rear == front; } // 新增資料到佇列 addQueue public void addQueue(int a){ if(isFull()){ System.out.println("佇列已滿,不能新增資料!!"); return; } array[++rear]=a; } // 資料出佇列 getQueue public void getQueue(){ if(isEmpty()){ throw new RuntimeException("佇列為空,不能出隊!!"); } int a = array[++front]; System.out.printf("出隊資料為%d",a); } // 顯示佇列的所有資料 showQueue public void showQueue(){ if(isEmpty()){ System.out.println("佇列為空!!!"); return; } System.out.println("佇列為:"); for(int i=0;i<array.length;i++){ System.out.printf("%d\t",array[i]); } System.out.println(); } // 顯示佇列頭的資料,注意不是取出資料 headQueue public int headQueue(){ if(isEmpty()){ throw new RuntimeException("佇列為空!!!"); } return array[front+1]; } }

3、陣列模擬環形佇列

1)目前陣列使用一次就不能使用,沒有達到複用的效果

2)將這個陣列使用演算法,改進成一個環形的佇列

【注意:自己理解】為什麼要預留一個空位?(即:陣列有八個位置 0-7,為什麼入隊到6處就算滿了)

這是因為:

當從0入隊到7時,rear此時指向的位置為 (7+1)% 8 = 0,rear == front

這就和判斷佇列為空重複了,為了避免兩種情況混淆,就將maxSize-1(8-1=7)作為環形佇列儲存元素的最大個數

程式碼實現

front:指向對頭

rear:指向隊尾的下一個元素

public class CircleArrayQueueDemo {
    public static void main(String[] args) {
        CircleArray queue =new CircleArray(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:檢視佇列頭的資料");

            key=scanner.next().charAt(0);
            switch (key){
                case 's':
                    queue.showQueue();
                    break;
                case 'a':
                    System.out.print("輸入一個數:");
                    int value = scanner.nextInt();
                    queue.addQueue(value);
                    break;
                case 'g':
                    try {
                        queue.getQueue();
                    } catch (Exception e) {
                        System.out.printf(e.getMessage());
                    }
                    break;
                case 'h':

                    try {
                        int v= queue.headQueue();
                        System.out.printf("從隊頭取出的元素為:%d",v);
                    } catch (Exception e) {
                        System.out.printf(e.getMessage());
                    }

                    break;
                case 'e':
                    scanner.close();
                    loop=false;
                    break;
            }
            System.out.println();
        }
        System.out.println("程式退出~~");
    }
}


class CircleArray{
    private int maxSize; //表示陣列的最大容量
    private int front;  //指向隊頭              預設為0
    private int rear;   //指向隊尾的後一個位置    預設為0
    private int[] array; //存放資料

    // 建立佇列的構造器
    public CircleArray(int maxSize) {
        this.maxSize = maxSize;
        array =new int[maxSize];
    }

    // 判斷佇列是否為滿
    public boolean isFull(){
        return (rear+1)%maxSize == front;
    }

    // 判斷佇列是否為空
    public boolean isEmpty(){
        return rear == front;
    }

    // 新增資料到佇列 addQueue
    public void addQueue(int a){
        if(isFull()){
            System.out.println("佇列已滿,不能新增資料!!");
            return;
        }
        array[rear]=a;
        rear=(rear+1)%maxSize;
    }

    // 資料出佇列 getQueue
    public void getQueue(){
        if(isEmpty()){
            throw new RuntimeException("佇列為空,不能出隊!!");
        }
        int a = array[front];
        front=(front+1)%maxSize;
        System.out.printf("出隊資料為%d",a);
    }

    // 顯示佇列的所有資料 showQueue
    public void showQueue(){
        if(isEmpty()){
            System.out.println("佇列為空!!!");
            return;
        }
        //從front遍歷,遍歷多少個元素
        System.out.println("佇列為:");
        for(int i=front;i<front+size();i++){
            System.out.printf("%d\t",array[i%maxSize]);
        }
        System.out.println();
    }

    //佇列的長度
    public int size(){
        return (rear+maxSize-front)%maxSize;
    }


    // 顯示佇列頭的資料,注意不是取出資料 headQueue
    public int headQueue(){
        if(isEmpty()){
            throw new RuntimeException("佇列為空!!!");
        }
        return array[front];
    }
}