今天开始学习泛类堆栈类

来源:互联网 发布:c语言自学软件手机版 编辑:程序博客网 时间:2024/06/05 07:13
//泛型堆栈类示例代码public class LinkedStack<T>{    private static class Node<U> {        U item;        Node<U> next;        Node()        { item = null;next = null; }        Node(U item,Node<U> next)        {            this.item = item;            this.next = next;        }        boolean end()        { return item == null && next == null; }    }    private Node<T> top = new Node<T>();    public void push(T item){        top = new Node<T>(item,top);    }    public T pop(){        T result = top.item;        if(!top.end())        {            top = top.next;        }        return result;    }    public static void main(String[] args)    {        LinkedStack<String> lss = new LinkedStack<String>();        for(String s: "Phasers or stun!".split(" "))            lss.push(s);        String s;        while((s = lss.pop()) != null)        {            System.out.println(s);        }    }}

该例子主要是实现了一个简单的泛型堆栈类,将s切割为3个字符串对象分别利用push方法压入堆栈中,而后在循环中使用pop方法将对象压出并打印。

在原来的C语言编程中实现堆栈,都是通过指针和结构体来实现的。但是在面向对象语言中实现堆栈还是有着很大的不同。首先ListedStack类中包含着一个内部类Node节点,该节点的主要作用是用来装载堆栈中的元素,而ListedStack类提供了相应的方法。从main函数开始,创建引用lss,并指向LinkedStack<String>类型的对象,该对象拥有值为null的字段item和一个Node<T>类型的引用,进入for循环后,利用push方法将“Phasers”,“or”,"stun"对象压入堆栈中,push方法内部原理是:首先上一步创建了一个空节点,top引用指向空节点对象,而push方法首先创建一个新的节点对象,并对该节点对象元素赋值(item,next),将空节点对象的引用赋给新的节点对象的next字段,然后将新的节点对象的地址赋给top引用,这样就压入了一个对象,而后将继续按照这种方式将剩下的两个对象分别压入堆栈中。同时pop方法则是将top指向的对象中的item元素值取出,并将该对象的next引用指向的对象赋给top引用,这样就实现了一次压出一个对象的操作,同理之后的操作按照这种方式进行即可实现压出操作。

注:其中pop方法中有个“末端哨兵”,其主要作用是用来判断当前节点是否是空节点,如果为空,则认为堆栈为空。