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

队列-使用Java封装

说明

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

解法

使用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 Queue {
    private Node front;
    private Node rear;
    private String name;  // 只是个名称

    // 利用建构子建立伫列
    public Queue();
    public Queue(String name);

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

    // 显示前端资料
    public void printFront();

    // 删除前端资料
    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
127
128
129
130
131
132
133
134
135
136
137
138
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 Queue { 
    private Node front; 
    private Node rear; 
    private String name;  // 只是个名称 

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

    // 利用建构子建立伫列 
    public Queue(String name) { 
        this.name = name; 
        front = new Node(); 
        front.setNext(null); 
        rear = front; 
    } 

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

        if(front.getNext() == null) 
            front.setNext(newNode); 

        newNode.setData(data); 
        newNode.setNext(null); 
        rear.setNext(newNode); 
        rear = newNode; 
    } 

    // 显示前端资料 
    public void printFront() { 
        if(front.getNext() == null) 
            System.out.print("\n伫列为空!"); 
        else 
            System.out.print("\n顶端值:" +  
                           front.getNext().getData()); 
    } 

    // 删除前端资料 
    public void del() { 
        Node tmpNode; 
    
        if(front.getNext() == null) { 
            System.out.print("\n伫列已空!"); 
            return; 
        } 

        tmpNode = front.getNext(); 
        front.setNext(tmpNode.getNext()); 
        tmpNode = null;    
    } 

    // 列出伫列内容 
    public void list() { 
        Node tmpNode; 

        tmpNode = front.getNext(); 

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

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

        Queue q1 = new Queue("伫列测试"); 

        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()); 
                    q1.add(input); 
                    break; 
                case 2: 
                    q1.printFront(); 
                    break; 
                case 3: 
                    q1.del(); 
                    break; 
                case 4: 
                    q1.list(); 
                    break; 
                default: 
                    System.out.print("\n选项错误!"); 
            } 
        } 

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