111年資訊技師高等程式設計

一、請用 Java C++ 實作一個資料結構堆疊 (stack) 的泛型 (Generics) 物件, stack 物件必須有下列函式 (Method)

    a.建構子 (Constructor) 及解構子 (Destructor),若以 Java 撰寫,不必解構子。

    b.void push( {datatype} a ) { .. },可以加資料入 stack 頂端。

    c.{datatype} pop( ) { .. },可以取出 stack 頂端資料。

    d.int length( ) { .. },傳回 stack 內資料的數量。

    e.void clear( ),清除 stack 物件內資料。

    f.void inverse( ) { .. },可以將 stack 內的資料存放順序顛倒放置。

    因為是泛型物件,上述之 {datatype} 是指使用者使用此物件時才會決定其資料型態。必須注意,此題的資料儲存空間必須使用動態矩陣,不能使用其他物件。另外也必須對物件進行封裝以及處理記憶空間不足時,動態增加空間的應變問題。(25分)

答:

package a20221007;

// Java Program to Implement Stack in Java Using Array and

// Generics

import java.io.*; // Importing input output classes

import java.util.*; // Importing all utility classes

// 使用者自訂泛型 Stack

class Stack<T> {

    ArrayList<T> A; // 空的 ArrayList

    int top = -1; // Stack 是空的,預設的 top 變數的值

    int size; // 儲存陣列的大小的變數

    // 初始化 Stack

    Stack(int size) {

        this.size = size; // 使用全域變數儲存 size 的值

        this.A = new ArrayList<T>(size); // 產生 size 的陣列

    }

    // push 泛型元素到 Stack

    void push(T X) {

        if (top+1 == size) {  // 當陣列是滿的時,展示訊息

            System.out.println("Stack Overflow");

        }

        else {

            top = top+1; // top 下一個位置加1

            if (A.size( ) > top) { // 覆寫已存在元素

                A.set(top, X);

            }

            else { // 產生新的元素

                A.add(X);

            }

        }

    }

    //  刪除 Stack 最後一個的元素

    void pop( ) {

        if (top == -1) { // 如果 Stack 是空的

            System.out.println("Stack Underflow"); // 當沒有元素在 Stack 時,展示訊息

        }

        else { // 刪除 Stack 最後一個的元素,top 位置減1

            top--;

        }

    }

    // 傳回 Stack 頂端的元素

    T top( ) {

        if (top == -1) { // 如果 Stack 是空的

            System.out.println("Stack Underflow"); // 當沒有元素在 Stack 時,展示訊息

            return null;

        }

        else { // 反之回傳最頂端元素

            return A.get(top);

        }

    }

    // 傳回 stack 內資料的數量

    int length( ) {

        return top+1;

    }

    // 清除 stack 物件內資料

    void clear( ) {

        int n = top;

        for (int i = n; i >= 0; i--) {

            A.remove(i); // 要由上而下刪除,否則會出現異常

            top--;

        }

    }

    // inverse方法一

    // 可以將 stack 內的資料存放順序顛倒放置

    void inverse( ) {

        ArrayList<Float> tmp = new ArrayList<Float>( ); // 空的 ArrayList

        // 取出原先的 ArrayList 資料加入到 tmp

        for (int i = top; i >= 0; i--) {

            tmp.add((Float)A.get(i));

            A.remove(i);

        }

        // 取出 tmp 資料加入到原先的 ArrayList

        for (int i = 0; i <= top; i++) {

            A.add((T)tmp.get(i)); // 以後再修改語法

        }

    }

    // inverse方法二

    void inverse2( ) {

        ArrayList<Float> tmp = new ArrayList<Float>( ); // 空的 ArrayList

        // 取出原先的 ArrayList 資料加入到 tmp

        for (int i = top; i >= 0; i--) {

            tmp.add((Float) this.top( ));

            A.remove(this.top( ));

            this.pop( );

        }

        // 取出 tmp 資料加入到原先的 ArrayList

        for (int i = 0; i < tmp.size( ); i++) {

            this.push((T)tmp.get(i)); // 以後再修改語法

        }

    }

    // 檢查 Stack 是否空的或是滿的

    boolean empty( ) {

        return top == -1;

    }

    // 印出 Stack 的內容

    // @Override

    public String toString( ) {

        String Ans = "";

        for (int i = 0; i < top; i++) {

            Ans += String.valueOf(A.get(i)) + "->";

        }

        Ans += String.valueOf(A.get(top));

        return Ans;

    }

}

// 主要類別

public class MyStack {

    public static void main(String[ ] args) {

        // 產生一個整數型態 Stack 類別

        Stack<Integer> s1 = new Stack< >(3);

        // push 元素到整數型態的 s1 Stack

        s1.push(10);  // 元素110

        s1.push(20);  // 元素220

        s1.push(30);  // 元素330

        // push 元素後,印出 Stack 元素

        System.out.println("s1 after pushing 10, 20 and 30 :\n" + s1);

        s1.pop( ); // 現在,從 s1 Stack pop 元素

        // pop 少數元素後,印出 Stack 元素

        System.out.println("s1 after pop :\n" + s1);

        // 產生一個字串型態的 Stack 類別

        Stack<String> s2 = new Stack< >(3);

        // push 元素到字串型態的 s2 Stack 類別

        s2.push("hello");  // 元素1 hello

        s2.push("world");  // 元素2 world

        s2.push("java");   // 元素3 java         

        // push 上述字串元素後,印出 Stack 元素

        System.out.println("\ns2 after pushing 3 elements :\n" + s2);

        System.out.println("s2 after pushing 4th element :");

        // Stack 上面,push 到另一個元素

        s2.push("GFG");  // 元素4 GFG

        // 宣告一個 Float 型態的 Stack 類別的物件

        Stack<Float> s3 = new Stack< >(5);

        // push float 型態的 s3 Stack

        s3.push(100.0f);  // 元素1 100.0

        s3.push(200.0f);  // 元素2 200.0

        // push 上述 float 元素後,印出 Stack 元素

        System.out.println("s3 after pushing 2 elements :\n" + s3);

        // 印出,並且展示 s3 Stack 頂端的元素

        System.out.println("top element of s3:\n"+s3.top( ));

        System.out.println("s3 All elements(1) :\n" + s3);

        s3.inverse();

        System.out.println("s3 All elements(2) :\n" + s3);

        s3.length();

        System.out.println("s3 length is " + s3.length( ));

        s3.clear();

        System.out.println("s3 length is " + s3.length( ));

        s3.push(300.0f);  // 元素2200.0

        System.out.println("s3 All elements :\n" + s3);

    }

}

答:

s1 after pushing 10, 20 and 30 :

10->20->30

s1 after pop :

10->20

 

s2 after pushing 3 elements :

hello->world->java

s2 after pushing 4th element :

Stack Overflow

s3 after pushing 2 elements :

100.0->200.0

top element of s3:

200.0

s3 All elements(1) :

100.0->200.0

s3 All elements(2) :

200.0->100.0

s3 length is 2

s3 length is 0

s3 All elements :

300.0

參考資料:

https://www.geeksforgeeks.org/how-to-implement-stack-in-java-using-array-and-generics/

arrow
arrow
    文章標籤
    111年資訊技師高等程式設計
    全站熱搜

    jacksaleok 發表在 痞客邦 留言(0) 人氣()