Spark SQL(4)-Unresolved Plan到Analyzed Plan
阿新 • • 發佈:2020-07-26
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]; } }