zoukankan      html  css  js  c++  java
  • 算法_栈与队列的Java链表实现

      链表是一个递归的数据结构,它或者为null,或者是指向一个结点的引用,该结点含有一个泛型的元素和指向另一个链表的引用.可以用一个内部类来定义节点的抽象数据类型:

    private class Node /*定义节点类*/{
            Item item;
            Node next;
        }

      根据递归的定义,我们只需一个Node类型的变量就能表示一条链表,只要保证它的值是null或者指向另一个Node对象,且该对象的next域指向了另一条链表即可.链表表示的是一列元素,虽然也可以用数组来表示一列元素,但是在链表中插入元素或者从序列中删除元素都十分方便.另外,每个修改链表的操作都需要添加检查是否要修改变量的代码.

      对于链表元素的遍历,可以采用下列方式:

    for(Node x=first;x!=null;x=x.next) {
            //处理x.item      
    }

      对于实现队列和堆栈,上面这种迭代方式是实现迭代器的最基本的方式.实现队列和堆栈通过内部维护一个链表,达到了操作所需的时间总是和集合的大小无关.下面是实现的代码:

    import java.util.Iterator;
    //链表实现的堆栈
    public class Stack<Item> implements Iterable<Item>{
        private Node first;        //定义栈顶
        private int N;            //定义元素的数量
        private class Node {
            Item item;
            Node next;
        }
        
        public boolean isEmpty() {
            return first==null;
        }
        public int size() {
            return N;
        }
        public void push(Item item) {
            //向栈顶添加元素
            Node oldfirst=first;
            first=new Node();
            first.item=item;
            first.next=oldfirst;
            N++;
        }
        public Item pop() {
            //从栈顶弹出元素
            Item item=first.item;
            first=first.next;
            N--;
            return item;
        }
        @Override
        public Iterator<Item> iterator() {
            return new StackIterator();
        }
        private class StackIterator implements Iterator<Item> {
            
            private Node current=first;
            @Override
            public boolean hasNext() {
                return current!=null;
            }
    
            @Override
            public Item next() {
                Item item=current.item;
                current=current.next;
                return item;
            }    
        }
    }
    //链表实现的队列
    import java.util.Iterator;
    public class Queue<Item> implements Iterable<Item> {
        private Node first;        //定义表头
        private Node last;        //定义表尾
        private int N;            //定义元素的数量
        private class Node /*定义节点类*/{
            Item item;
            Node next;
        }
        public boolean isEmpty() {return first==null;}
        public int size() {return N;}
        public void enquene(Item item) {
            //向表尾添加元素
            Node oldlast=last;
            last=new Node();
            last.item=item;
            last.next=null;
            if(isEmpty()) first=last;    //如果添加前,列表为空,此时表头与表尾指向同一元素
            else oldlast.next=last;    //将之前的尾部元素的下一个元素指向新的尾部元素
            N++;    //增加元素数目
        }
        public Item dequeue() {
            Item item=first.item;    
            first=first.next;
            if(isEmpty()) last=null;    //如果列表成为空,那么将尾部元素设为null
            N--;                        //减少元素数目.
            return item;
        }
        @Override
        public Iterator<Item> iterator() {
            return new QueueIterator();
        }
    private class QueueIterator implements Iterator<Item> /*和栈迭代器的实现完全一样*/{
            
            private Node current=first;
            @Override
            public boolean hasNext() {
                return current!=null;
            }
    
            @Override
            public Item next() {
                Item item=current.item;
                current=current.next;
                return item;
            }    
        }
    }
  • 相关阅读:
    Splay专题总结
    UVa12657
    ZOJ3772
    POJ1743
    高斯消元模板
    python使用chrom登陆微博
    mysql常用数据库(表)命令
    mysql索引
    mysql建表的时候,时间戳的选用
    php 金额每三位添加一个逗号
  • 原文地址:https://www.cnblogs.com/hlhdidi/p/5626418.html
Copyright © 2011-2022 走看看