Java 程式設計()  第 四章 陣列資料結構  上一頁    下一頁

 

4-5 佇列資料結構

內容:

  • 4-5-1 陣列佇列結構

  • 4-5-2 範例研討:醫院掛號系統

  • 4-5-3 自我挑戰:醫生看診系統

4-5-1 陣列佇列結構

佇列(Queue)在資訊系統裡時常用到,是屬於排列順序裝置,順序是『先進先出』(First-In-First-Out, FIFO),表示先來的先出去的意思。圖 4-16 Queue 的儲存結構,它有 Front(前端) Rear(後端) 兩個口,Front 是資料的出口;Rear 是資料的入口,也就是資料由 Rear 進入,由 Front 出去。

4-16 Queue 的運作程序

各種資料結構(如鏈路、樹狀、、等等)都可以用來實現佇列功能,但我們還是用最簡單的陣列來實現它。圖 4-17 是陣列佇列結構圖,我們取用一個陣列(假設空間為 50),佇列出口(Front)固定在陣列 0 位置(queue[0]),佇列入口(Rear)採用游標方式,指示目前佇列可儲存的空閒位置。當資料插入佇列時,則存入 Rear 所指位置,並且將 Rear 內容加一,並判斷是否超載(大於 50)。如果由 Front 取出資料時,則所有資料往前移一位,到 Rear 所指位置為止,並將其內容減一。

4-17 陣列實現 Queue 結構

4-5-2 範例研討:醫院掛號系統

(A) 系統功能:Ex4_6.java

甄美麗美容中心需要一套掛號系統,功能是記錄客戶掛號的先後順序,功能如下:

(1) 具有顯示目前掛號客戶順序、登錄客戶掛號之功能,選單如下:

D:\Java2_book\chap4>javac Ex4_6.java

 

D:\Java2_book\chap4>java Ex4_6

== 歡迎光臨 甄美麗掛號系統 ==

(1) 列印目前掛號客戶名單

(2) 客戶掛號

(3) 離開系統

         請輸入工作選項 =>

(2) 當選擇登錄客戶掛號(選擇 2),如下:

         請輸入工作選項 =>2

請輸入客戶姓名 =>張大有

張大有 已掛號成功!!

== 歡迎光臨 甄美麗掛號系統 ==

(1) 列印目前掛號客戶名單

(2) 客戶掛號

(3) 離開系統

         請輸入工作選項 =>2

請輸入客戶姓名 =>林旺

林旺 已掛號成功!!

(3) 選擇顯示目前掛號客戶名單(選擇 1),如下:

         請輸入工作選項 =>1

 

== 目前有 2 位客戶掛號 ==

(1)張大有

(2)林旺

== 歡迎光臨 甄美麗掛號系統 ==

(1) 列印目前掛號客戶名單

(B) 系統分析

我們需建立一個 Queue 陣列來存放客戶掛號順序,Queue 是要儲存客戶名單,因此需要宣告程字串(String) 資料型態。

(C) 程式範例

4-18 為其程式架構,其中 Queue[]FrontRear 3 個類別變數是佇列的主要裝置,再利用 4 個方法來實現系統功能。

4-18 Ex4_6 程式架構

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

//Ex4_6.java

/* 醫院掛號系統(僅插入 Queue 功能) */

 

import java.util.*;

public class Ex4_6{

  static String Queue[] = new String[50];     // 宣告佇列空間

  static int Rear;                      // 宣告佇列後端

  static int Front=0;                   // 宣告佇列前端

  public static void main(String args[]) {

      Scanner keyin = new Scanner(System.in);

      Rear = -1;              // 佇列初值,表示佇列空閒

      String customer;

      int select;

      disp_menu();

      select = keyin.nextInt();

      while(select != 3) {

          switch(select) {

             case 1:

                  disp_Queue();

                  break;

             case 2:

                  System.out.printf("請輸入客戶姓名 =>");

                  customer = keyin.next();

                  if (enQueue(customer))

                      System.out.printf("%s 已掛號成功!!\n", customer);

                  else

                      System.out.printf("目前掛號已滿請稍候再掛!!\n");

                   break;

             default:

                 System.out.printf("輸入錯誤 !! 請重新輸入\n");

          }

          disp_menu();

          select = keyin.nextInt();

      }

 

   }

// 列印功能表

   static void disp_menu() {

       System.out.printf("== 歡迎光臨 甄美麗掛號系統 ==\n");

       System.out.printf("(1) 列印目前掛號客戶名單\n");

       System.out.printf("(2) 客戶掛號\n");

       System.out.printf("(3) 離開系統\n");

       System.out.printf("\t 請輸入工作選項 =>");

   }

// 列印 Queue 內容

  static void disp_Queue() {     

      System.out.printf("\n== 目前有 %d 位客戶掛號 ==\n", Rear+1);   

      for(int i=0; i<= Rear; i++)

           System.out.printf("(%d)%s \n", i+1, Queue[i]);

   }

// 加入 Queue 元素

   static boolean enQueue(String customer){

      if (Rear >= 50) {

          return false;

      }else {

          Rear = Rear +1;

          Queue[Rear] = customer;

          return true;

      }

   }

}

4-5-3 自我挑戰:醫生看診系統

(A) 系統功能:PM4_4.java

甄美麗美容中心除了客戶掛號功能外,還需要醫生看診系統,請您擴充 Ex4_6.java系統的功能,使其具有醫生看診順序的功能。基本上,醫生看診是依照客人先來先看(Queue 功能)。當醫生選擇一位客戶時,則由掛號系統刪除該客戶排隊,其他客戶往前移一位,功能如下:

(1) 具有顯示目前掛號客戶順序、登錄客戶掛號之功能,選單如下:

D:\Java2_book\chap4>javac PM4_4.java

 

D:\Java2_book\chap4>java PM4_4

== 歡迎光臨 甄美麗掛號系統 ==

(1) 列印目前掛號客戶名單

(2) 客戶掛號

(3) 醫生看診客戶

(4) 離開系統

         請輸入工作選項 =>

(2) 當選擇登錄客戶掛號,並顯示已掛號客戶(選擇 2 1),如下:

         請輸入工作選項 =>2

請輸入客戶姓名 =>劉真立

劉真立 已掛號成功!!

== 歡迎光臨 甄美麗掛號系統 ==

(1) 列印目前掛號客戶名單

(2) 客戶掛號

(3) 醫生看診客戶

(4) 離開系統

         請輸入工作選項 =>2

請輸入客戶姓名 =>張真真

張真真 已掛號成功!!

== 歡迎光臨 甄美麗掛號系統 ==

(1) 列印目前掛號客戶名單

(2) 客戶掛號

(3) 醫生看診客戶

(4) 離開系統

         請輸入工作選項 =>1

 

== 目前有 2 位客戶掛號 ==

(1)劉真立

(2)張真真

(3) 選擇醫生看診客戶姓名並觀察客戶掛號名單(選擇 3 1),如下:

         請輸入工作選項 =>3

劉真立 先生/小姐進入看診室

== 歡迎光臨 甄美麗掛號系統 ==

(1) 列印目前掛號客戶名單

(2) 客戶掛號

(3) 醫生看診客戶

(4) 離開系統

         請輸入工作選項 =>1

 

== 目前有 1 位客戶掛號 ==

(1)張真真

(B) 系統分析

醫生叫診是依照先進先出的規則,每叫一個客戶則表示由 Queue 內刪除一個元素,因此,僅依照 Ex4_6 擴充刪除佇列元素的功能即可。

(C) 程式提示

4-19 為其程式架構,增加了 emptyQueue() deQueue() 兩個方法,前者是測試 Queue 是否已空閒,表示有沒有掛號中的客戶;後者是醫生叫號後,刪除前面的客戶。

4-19 PM4_4 程式架構

程式提示如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

//PM4_4.java

/* 醫院掛號系統(含客戶掛號與醫生看診順序的功能) */

 

import java.util.*;

public class PM4_4{

  …….

      while(select != 4) {

          switch(select) {

            

        …………………

             case 3:

                  if (emptyQueue())

                      System.out.printf("目前沒有客戶掛號\n");

                  else{

                     customer = deQueue();

                     System.out.printf(" %s 先生/小姐進入看診室\n", customer);

                  }

break;

             ……..

      }

 

   }

// 列印功能表

   static void disp_menu() {

   …….

   }

// 列印 Queue 內容

  static void disp_Queue() {     

      ……..

   }

// 加入 Queue 元素

   static boolean enQueue(String customer){

      ……..

   }

// 探索 Queue 是否空閒

   static boolean emptyQueue(){

      if (Rear < 0)

          return true;

      else

          return false;

   }

// 刪除 Queue 元素

   static String deQueue() {

       String customer = Queue[Front];

       for (int i=Front; i< Rear; i++)

           Queue[i] = Queue[i+1];

       Rear = Rear - 1;

       return customer;

   }

}

翻轉工作室:粘添壽

 

Java 程式設計(二) 含物件導向

 

 

翻轉電子書系列: