jmu-Java-PTA(6.1-jmu-Java-05集合-01-ListIntegerStack,6.2- 銀行業務佇列簡單模擬)

取名字比写博客还难發表於2024-10-24

6.1-jmu-Java-05集合-01-ListIntegerStack

問題要求

定義IntegerStack介面,該介面描述了一個存放Integer的棧的常見方法:

public Integer push(Integer item); // 如item為null,則不入棧直接返回null。否則直接入棧,然後返回item。
public Integer pop(); // 出棧,如棧為空,則返回null。
public Integer peek(); // 獲得棧頂元素,如棧頂為空,則返回null。注意:不要出棧
public boolean empty(); // 如果棧為空返回true
public int size();  // 返回棧中元素數量

定義IntegerStack的實現類ArrayListIntegerStack,內部使用ArrayList儲存。該類中包含:

構造方法:
在無參構造方法中新建ArrayList或者LinkedList,作為棧的內部儲存。
思考:查詢JDK文件,嘗試說明本題到底使用哪個List實現類最好。

方法:

public String toString()       //用於輸出List中的內容,可直接呼叫List的toString()方法。可用System.out.println(list)進行輸出。

提示:
不建議使用top指標。最好直接複用List實現類中已有的方法。
pop時應將相應的元素從列表中移除。
main方法說明
建立ArrayListIntegerStack物件
輸入m個值,均入棧。每次入棧均列印入棧返回結果。
輸出: 棧頂元素,輸出是否為空,然後輸出size.
輸出棧中所有元素(呼叫其toString()方法)
輸入x,然後出棧x次,每次均列印出棧的物件。
輸出:棧頂元素,輸出是否為空,輸出size。注意:這裡的輸出棧頂元素,僅輸出、不出棧。
輸出棧中所有元素(呼叫其toString()方法)。注意:返回null,也要輸出。
思考:
如果使用LinkedList來實現IntegerStack,怎麼實現?測試程式碼需要進行什麼修改?

輸入樣例:

5
1 3 5 7 -1
2

輸出樣例:

1
3
5
7
-1
-1,false,5
[1, 3, 5, 7, -1]
-1
7
5,false,3
[1, 3, 5]

解題步驟

第一步:介面定義

首先,定義了一個IntegerStack介面,其中包含了棧的基本操作方法,如入棧、出棧、檢視棧頂元素、判斷棧是否為空以及獲取棧的大小。

interface IntegerStack {
    public Integer push(Integer item);
    public Integer pop();
    public Integer peek();
    public boolean empty();
    public int size();
}

第二步:實現類

接下來,實現了一個名為ArrayListIntegerStack的類,該類實現了IntegerStack介面。

第三步:構造方法

在無參構造方法中,初始化了一個ArrayList作為棧的內部儲存。

class ArrayListIntegerStack implements IntegerStack {
    private ArrayList<Integer> arr = new ArrayList<>();
}

第四步:方法實現

對於每個介面方法,我們都提供了具體的實現:

  • push 方法將元素新增到棧頂,如果元素為null,則不新增並返回null
  • pop 方法移除並返回棧頂元素,如果棧為空,則返回null
  • peek 方法返回棧頂元素,但不移除它。
  • empty 方法檢查棧是否為空。
  • size 方法返回棧中元素的數量。
  • toString 方法用於輸出棧的內容。
// ...其他方法...
@Override
public String toString() {
    return arr.toString();
}

第五步:主方法

Main類中,我們建立了一個ArrayListIntegerStack物件,並執行了一系列操作,如入棧、出棧,並列印相關資訊。

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        ArrayListIntegerStack stack = new ArrayListIntegerStack();
        int m = in.nextInt();
        for (int i = 0; i < m; i++) {
            Integer n = in.nextInt();
            Integer e = stack.push(n);
            System.out.println(e);
        }
        System.out.println(stack.peek() + "," + stack.empty() + "," + stack.size());
        System.out.println(stack.toString());
        int x = in.nextInt();
        for (int i = 0; i < x; i++) {
            Integer e = stack.pop();
            System.out.println(e);
        }
        System.out.println(stack.peek() + "," + stack.empty() + "," + stack.size());
        System.out.println(stack.toString());
    }
}

整體程式碼:

import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;

interface IntegerStack{
    public Integer push(Integer item);
    public Integer pop();
    public Integer peek();
    public boolean empty();
    public int size();
}

class ArrayListIntegerStack implements IntegerStack{
    private static ArrayList<Integer> arr = new ArrayList<>();

    public Integer push(Integer item){
        if(item == null){
            return null;
        }else{
            arr.add(item);
        }
        return item;
    }

    public Integer pop(){
        if(arr.size() == 0){
            return null;
        }else{
            Integer e = arr.get(arr.size()-1);
            arr.remove(arr.size()-1);
            return e;
        }
    }

    public Integer peek(){
        if(arr.isEmpty()){
            return null;
        }else{
            Integer e = arr.get(arr.size()-1);
            return e;
        }
    }

    public boolean empty(){
        if(!arr.isEmpty()){
            return false;
        }else{
            return true;
        }
    }

    public int size(){
        return arr.size();
    }

    public String toString(){
        if(arr.isEmpty()){
            return "[]";
        }
        return arr.toString();
    }
}

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        ArrayListIntegerStack arr = new ArrayListIntegerStack();
        int m = in.nextInt();
        for(int i=0;i<m;i++){
            Integer n = in.nextInt();
            Integer e = arr.push(n);
            System.out.println(e);
        }
        System.out.println(arr.peek()+","+arr.empty()+","+arr.size());
        System.out.println(arr.toString());
        int x = in.nextInt();
        for(int i=0;i<x;i++){
            Integer e = arr.pop();
            System.out.println(e);
        }
        System.out.println(arr.peek()+","+arr.empty()+","+arr.size());
        System.out.println(arr.toString());
    }
}

思考

如果使用LinkedList來實現IntegerStack,實現方式將非常相似,因為LinkedList也實現了List介面。主要的不同在於內部資料結構,LinkedList在頻繁的插入和刪除操作中可能更高效。
對於測試程式碼,如果切換到LinkedList則不需要做任何修改,因為ArrayListIntegerStack類完全依賴於List介面的方法,而不是ArrayList特有的方法。

6.2- 銀行業務佇列簡單模擬

問題要求

設某銀行有A、B兩個業務視窗,且處理業務的速度不一樣,其中A視窗處理速度是B視窗的2倍 —— 即當A視窗每處理完2個顧客時,B視窗處理完1個顧客。給定到達銀行的顧客序列,請按業務完成的順序輸出顧客序列。假定不考慮顧客先後到達的時間間隔,並且當不同視窗同時處理完2個顧客時,A視窗顧客優先輸出。

輸入格式:

輸入為一行正整數,其中第1個數字N(≤1000)為顧客總數,後面跟著N位顧客的編號。編號為奇數的顧客需要到A視窗辦理業務,為偶數的顧客則去B視窗。數字間以空格分隔。

輸出格式:

按業務處理完成的順序輸出顧客的編號。數字間以空格分隔,但最後一個編號後不能有多餘的空格。

輸入樣例:

8 2 1 3 9 4 11 13 15

輸出樣例:

1 3 2 9 11 4 13 15

關鍵點

  • 視窗處理速度差異:A視窗每處理兩個顧客,B視窗才能處理一個顧客。
  • 顧客編號規則:奇數編號的顧客去A視窗,偶數編號的顧客去B視窗。
  • 輸出順序:A視窗的顧客優先輸出,當兩個視窗同時處理完顧客時。

解題步驟

第一步:初始化資料結構

為了模擬兩個視窗,可以使用兩個LinkedList來分別儲存A視窗和B視窗的顧客。

LinkedList<Integer> lista = new LinkedList<>();
LinkedList<Integer> listb = new LinkedList<>();

第二步:分配顧客到視窗

遍歷輸入的顧客編號,根據編號的奇偶性將顧客分配到對應的視窗佇列中。

for (int i = 0; i < n; i++) {
    int e = in.nextInt();
    if (e % 2 != 0) {
        lista.add(e);
    } else {
        listb.add(e);
    }
}

第三步:處理顧客並輸出

透過一個迴圈來模擬視窗處理顧客的過程。在這個迴圈中,根據題目要求我們需要處理以下幾點:

  • A視窗的處理速度是B視窗的兩倍,因此我們需要一個計數器count來記錄A視窗處理的顧客數量。
  • count達到2時,表示A視窗處理了兩個顧客,這時我們也需要處理B視窗的一個顧客。
  • 輸出顧客編號時,需要注意格式,尤其是最後一個編號後不能有多餘的空格。
int count = 1;
int flag = 1; // 用於控制輸出格式
while (lista.size() != 0 && listb.size() != 0) {
    if (count != 2) {
        // 輸出A視窗的顧客
        System.out.print((flag == 1 ? "" : " ") + lista.get(0));
        lista.remove(0);
        count++;
    } else {
        // 輸出A視窗和B視窗的顧客
        System.out.print(" " + lista.get(0));
        lista.remove(0);
        System.out.print(" " + listb.get(0));
        listb.remove(0);
        count = 1;
    }
    flag = 2;
}

第四步:處理剩餘顧客

在主迴圈結束後,可能還有顧客在某個視窗的佇列中等待處理。我們需要分別處理這兩個佇列中的剩餘顧客。

while (lista.size() != 0) {
    System.out.print((flag == 1 ? "" : " ") + lista.get(0));
    lista.remove(0);
    flag = 2;
}
while (listb.size() != 0) {
    System.out.print((flag == 1 ? "" : " ") + listb.get(0));
    listb.remove(0);
}

整體程式碼:

import java.util.Scanner;
import java.util.LinkedList;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        LinkedList<Integer> lista = new LinkedList<>();
        LinkedList<Integer> listb = new LinkedList<>();
        for(int i=0;i<n;i++){
            int e = in.nextInt();
            if(e%2!=0){
                lista.add(e);
            }else{
                listb.add(e);
            }
        }
        int count=1;
        int flag = 1;
        while(lista.size()!=0&&listb.size()!=0){
            if(count!=2){
                if(flag==1){
                    flag=2;
                    System.out.print(lista.get(0));
                }else{
                    System.out.print(" "+lista.get(0));
                }
                lista.remove(0);
                count += 1;
            }else{
                count = 1;
                System.out.print(" "+lista.get(0));
                lista.remove(0);
                System.out.print(" "+listb.get(0));
                listb.remove(0);
            }
        }

        while(lista.size()!=0){
            if(flag==1){
                    flag=2;
                    System.out.print(lista.get(0));
                }else{
                    System.out.print(" "+lista.get(0));
                }
            lista.remove(0);
        }

        while(listb.size()!=0){
            if(flag==1){
                    flag=2;
                    System.out.print(listb.get(0));
                }else{
                    System.out.print(" "+listb.get(0));
                }
            listb.remove(0);
        }
    }
}

相關文章