Pome资料库
Pome 切换暗/亮/自动模式 切换暗/亮/自动模式 切换暗/亮/自动模式 返回首页

堆叠-使用Java封装

说明

如果您使用C++或Java等支援物件导向的语言来实作堆叠,您可以使用类别的方式来包括堆叠的功能,将所有的堆叠操作由堆叠物件来处理,一旦包装完成,则使用堆叠物件的时候,只要呼叫加入、删除等方法,而无需处理堆叠的top或判断是否为空等细节。

解法

使用C++与使用Java来作类别包装其实是类似的,在这边我们使用Java实作,因为它的语法看来较简洁;Java虽然没有指标,但可以使用参考(Reference)来达到链结的效果,一个节点的类别包装方式如下:

class Node {
    private int data;   // 节点资料
    private Node next;  // 下一个节点位置

    public void setData(int data);  // 节点资料
    public void setNext(Node next);  // 下一个节点位置
    public int getData();  // 传回节点资料
    public Node getNext();  // 传回下一个节点位置
}

其中next是个物件参考名称,它可以用来参考至(指向)下一个节点物件的记忆体位置,而堆叠类别可以如下包装:

class Stack {
    private Node top;    // 堆叠顶端
    private String name;  // 只是个名称

    // 利用建构子建立堆叠
    public Stack();
    public Stack(String name);

    // 插入资料至顶端
    public void add(int data);

    // 传回顶端资料
    public int printTop();

    // 删除顶端资料
    public void del();

    // 列出堆叠内容
    public void list();
}

利用物件导向来包装资料结构,虽然在设计时需要花较多的心思,但设计完成之后,日后呼叫使用就简单了,以后您只要注意主程式的逻辑设计就可以了。

参考代码

Java

  1
  2
  3
  4
  5
  6
  7
  8
  9
 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
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import java.io.*; 

// 节点 
class Node { 
    private int data;   // 节点资料 
    private Node next;  // 下一个节点位置 

    public void setData(int data) {  // 节点资料 
        this.data = data; 
    } 

    public void setNext(Node next) {  // 下一个节点位置 
        this.next = next; 
    } 

    public int getData() {  // 传回节点资料 
        return data; 
    } 

    public Node getNext() {  // 传回下一个节点位置 
        return next; 
    } 
} 

// 堆叠 
class Stack { 
    private Node top; 
    private String name;  // 只是个名称 

    public Stack() { 
        this("list"); 
    } 

    // 利用建构子建立堆叠 
    public Stack(String name) { 
        this.name = name; 
        top = null; 
    } 

    // 插入资料至顶端 
    public void add(int data) { 
        Node newNode = new Node(); 
        newNode.setData(data); 
        newNode.setNext(top); 
        top = newNode; 
    } 

    // 传回顶端资料 
    public int printTop() { 
        return top.getData(); 
    } 

    // 删除顶端资料 
    public void del() { 
        Node tmpNode; 
        tmpNode = top; 

        if(tmpNode == null) { 
            System.out.println("\n堆叠已空!"); 
            return; 
        } 

        top = top.getNext(); 
        tmpNode = null; 
    } 

    // 列出堆叠内容 
    public void list() { 
        Node tmpNode; 
        tmpNode = top; 

        System.out.print("\n堆叠内容:"); 
        while(tmpNode != null) { 
            System.out.print(tmpNode.getData() + " "); 
            tmpNode = tmpNode.getNext(); 
        } 
    } 
} 

public class StackShow { 
    public static void main(String[] args) 
                                  throws IOException { 
        int input, select; 
        BufferedReader buf; 
        buf = new BufferedReader(
                       new InputStreamReader(System.in)); 

        Stack s1 = new Stack("堆叠测试"); 

        while(true) {  
            System.out.print("\n\n请输入选项(-1结束):"); 
            System.out.print("\n(1)插入值至堆叠"); 
            System.out.print("\n(2)显示堆叠顶端"); 
            System.out.print("\n(3)删除顶端值"); 
            System.out.print("\n(4)显示所有内容"); 
            System.out.print("\n$c>"); 

            select = Integer.parseInt(buf.readLine()); 

            if(select == -1) 
                break; 

            switch(select) { 
                case 1: 
                    System.out.print("\n输入值:"); 
                    input = Integer.parseInt(buf.readLine()); 
                    s1.add(input); 
                    break; 
                case 2: 
                    System.out.print("\n顶端值:" +  
                                             s1.printTop()); 
                    break; 
                case 3: 
                    s1.del(); 
                    break; 
                case 4: 
                    s1.list(); 
                    break; 
                default: 
                    System.out.print("\n选项错误!"); 
            } 
        } 

        System.out.println(""); 
    } 
}