TQC+ 物件導向程式語言 Java 6 609 堆疊擴充
題目前後相關,請閱讀完這個題組的五個題目之後再作答,每題答案皆能獨立執行。請將需要重複或共同使用的程式片段撰寫成函式,以供在類別中呼叫使用,避免在不同的類別中重複寫相同的程式碼,否則將酌量扣分。
題目一:
題目說明:
請開啟檔案 JPD06_1.java,設計「堆疊」程式,請依下列題意完成作答。將 JPD06_1.java 內的 class JPD06_1 修改為 class JPA06_1,將檔案另存為 JPA06_1.java 後編譯為 JPA06_1.class,所有題目中有使用到的類別也請編譯後一併儲存。
設計說明:
(1) 請使用陣列寫一個 BoundedStack 類別。
(2) 在宣告時便需要指定一個 BoundedStack 堆疊的大小。
(3) BoundedStack 有三個方法:push (存入堆疊資料)、pop (從堆疊中取出資料)及測試一個 BoundedStack 實例是否為空的 empty 方法 (Boolean 值)。
(4) 在 push 方法中,若判斷已超出堆疊最大容量,則顯示【stack-overflow】。
(5) 在 pop 方法中,若堆疊區為空值,則顯示【stack-is-empty】。
(6) 在測試是否為空值的方法,若為空值,請傳回【true】,否則傳回【false】。
(7) 請依照程式 class JPD06_1 内提供的順序依序印出,顯示如執行結果參考畫面。
執行結果參考畫面:
程式碼:
class BoundedStack {
int size, index = 0;
String[] stack;
BoundedStack(int size) {
this.size = size;
stack = new String[size];
}
void push(String data) {
if(index < size) {
stack[index] = data;
index++;
}
else
System.out.println("stack-overflow");
}
String pop() {
if(index > 0)
return stack[--index];
else
return "stack-is-empty";
}
boolean empty() {
return index == 0;
}
}
public class JPA06_1 {
public static void main(String args[]) {
BoundedStack s = new BoundedStack(3);
s.push("abc");
s.push("def");
s.push("ghi");
s.push("jkl");
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.empty());
}
}
題目二:
題目說明:
請開啟 JPD06_2.java,並設計一個 UnboundedStack 類別,請依下列題意完成作答。將 JPD06_2.java 内的 class JPD06_2 修改為 class JPA06_2,將檔案另存為 JPA06_2.java 後編譯為 JPA06_2.class,所有題目中有使用到的類別也請編譯後一併儲存。
設計說明:
(1) 請使用 LinkedList 寫一個 UnboundedStack 類別。
(2) UnboundedStack 有三個方法:push (存入堆疊資料)、pop (從堆疊中取出資料) 及測試一個 UnboundedStack 實例是否是空值的 empty 方法 (Boolean 值)。
(3) 在 pop 方法中,若堆疊區為空值,則顯示【Stack is empty!】。
(4) 在測試是否為空值的方法,若為空值,請傳回【true】,否則傳回【false】。
(5) 請依照程式 class JPD06_2 内提供的順序依序印出,顯示如執行結果參考畫面。
執行結果參考畫面:
程式碼:
import java.util.LinkedList;
class UnboundedStack {
LinkedList list = new LinkedList();
void push(String data) {
list.addFirst(data);
}
String pop() {
if(!list.isEmpty()) {
String data = (String) list.getFirst();
list.removeFirst();
return data;
}
else
return "Stack is empty!";
}
boolean empty() {
return list.size() == 0;
}
}
public class JPA06_2 {
public static void main(String args[]) {
UnboundedStack s = new UnboundedStack();
s.push("abc");
s.push("def");
s.push("ghi");
s.push("jkl");
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.empty());
System.out.println(s.pop());
System.out.println(s.empty());
}
}
題目三:
題目說明:
請開啟 JPD06_3.java,請使用前兩題的答案並以 Java 的抽象類別及繼承,完成以下幾個在功能上逐步擴充的堆疊 (stack),請依下列題意完成作答。將 JPD06_3.java 内的 class JPD06_3 修改為 class JPA06_3,將檔案另存為 JPA06_3.java 後編譯為 JPA06_3.class,所有題目中有使用到的類別也請編譯後一併儲存。
設計說明:
(1) 請使用前兩題的答案並以 Java 的抽象類別及繼承,完成以下幾個在功能上逐步擴充的堆疊 (Stack)。這幾個類別的繼承結構如下:
(2) 請寫一個 Stack 類別,Stack 提供了一個 top 方法,top 先使用 pop 傳回一個堆疊頂端的值,再使用 push 還原該堆疊的儲存值。此外,Stack 的子類別所產生的實例都只可以存放 String。
(3) 請再寫一個 TraceUnboundedStack 類別,這個類別繼承 UnboundedStack。
(4) TraceUnboundedStack 的 getSize 方法請傳回 stack.size() 後的數值。
(5) 每次呼叫 push 方法,請先印出【Pushing: + value】,再於下方印出此 value 值。
(6) 每次呼叫 pop 方法,請先印出【Poping: + value】,再於下方印出此 value 值。
(7) 請依照程式 class JPD06_3 内提供的順序依序印出,顯示如執行結果參考畫面。
執行結果參考畫面:
程式碼:
import java.util.LinkedList;
abstract class Stack {
abstract void push(String data);
abstract String pop();
abstract boolean empty();
String top() {
String data = pop();
push(data);
return data;
}
}
class BoundedStack extends Stack {
int size, index = 0;
String[] stack;
BoundedStack(int size) {
this.size = size;
stack = new String[size];
}
void push(String data) {
if(index < size) {
stack[index] = data;
index++;
}
else
System.out.println("stack-overflow");
}
String pop() {
if(index > 0)
return stack[--index];
else
return "stack-is-empty";
}
boolean empty() {
return index == 0;
}
}
class UnboundedStack extends Stack {
LinkedList list = new LinkedList();
void push(String data) {
list.addFirst(data);
System.out.println("Pushing: " + data);
}
String pop() {
if(!list.isEmpty()) {
String data = (String) list.getFirst();
list.removeFirst();
System.out.println("Poping: " + data);
return data;
}
else
return "Stack is empty!";
}
boolean empty() {
return list.size() == 0;
}
}
class TraceUnboundedStack extends UnboundedStack {
int getSize() {
return list.size();
}
}
public class JPA06_3 {
public static void main(String args[]) {
TraceUnboundedStack s2 = new TraceUnboundedStack();
s2.push("abc");
s2.push("def");
s2.push("ghi");
s2.push("jkl");
System.out.println(s2.getSize());
System.out.println(s2.top());
System.out.println(s2.pop());
System.out.println(s2.pop());
System.out.println(s2.pop());
System.out.println(s2.empty());
System.out.println(s2.pop());
System.out.println(s2.empty());
System.out.println(s2.getSize());
}
}
題目四:
題目說明:
請開啟 JPD06_4.java,以 generic 的方式改寫類別程式,請依下列題意完成作答。將 JPD06_4.java 内的 class JPD06_4 修改為 class JPA06_4,將檔案另存為 JPA06_4.java 後編譯為 JPA06_4.class,所有題目中有使用到的類別也請編譯後一併儲存。
設計說明:
(1) 請將 Stack 及 UnboundedStack 類別以 generic 的方式改寫,使得 UnboundedStack 能產生可以儲存數字的實例,也可以產生能儲存 String 的實例等等。
(2) 請依照程式 class JPD06_4 提供的順序依序印出,顯示如執行結果參考畫面。
執行結果參考畫面:
程式碼:
import java.util.LinkedList;
abstract class Stack {
abstract void push(Object data);
abstract Object pop();
abstract boolean empty();
Object top() {
Object data = pop();
push(data);
return data;
}
}
class UnboundedStack extends Stack {
LinkedList list = new LinkedList();
void push(Object data) {
list.addFirst(data);
}
Object pop() {
if(!list.isEmpty()) {
Object data = (Object) list.getFirst();
list.removeFirst();
return data;
}
else
return null;
}
boolean empty() {
return list.size() == 0;
}
}
public class JPA06_4 {
public static void main(String args[]) {
UnboundedStack s = new UnboundedStack();
s.push("abc");
s.push(2);
s.push("ghi");
System.out.println(s.top());
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
}
}
題目五:
題目說明:
請開啟 JPD06_5.java,為題目四增加例外處理的功能,請依下列題意完成作答。將 JPD06_5.java 内的 class JPD06_5 修改為 class JPA06_5,將檔案另存為 JPA06_5.java 後編譯為 JPA06_5.class,所有題目中有使用到的類別也請編譯後一併儲存。
設計說明:
(1) 請為題目四增加例外處理的功能,使得 pop 一個空的堆疊時,可以印出【Stack is empty!】。
執行結果參考畫面:
程式碼:
import java.util.LinkedList;
abstract class Stack {
abstract void push(Object data);
abstract Object pop();
abstract boolean empty();
Object top() throws Exception {
Object data = pop();
push(data);
return data;
}
}
class UnboundedStack extends Stack {
LinkedList list = new LinkedList();
void push(Object data) {
list.addFirst(data);
}
Object pop() {
if(!list.isEmpty()) {
Object data = (Object) list.getFirst();
list.removeFirst();
return data;
}
else
throw new EmptyException("Stack is empty!");
}
boolean empty() {
return list.size() == 0;
}
}
class EmptyException extends RuntimeException { // 自訂的例外類別一定要是 Throwable 的衍生類別,也可以 extends Exception,但就要再新增一些 throws EmptyException。
EmptyException(String str) {
System.out.println(str);
}
}
public class JPA06_5 {
public static void main(String args[]) throws Exception {
try {
UnboundedStack s = new UnboundedStack();
s.push("abc");
s.push(2);
s.push("ghi");
System.out.println(s.top());
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
} catch(EmptyException e) {}
}
}