zoukankan      html  css  js  c++  java
  • 集合(二)栈和链表

    3.stack

     栈,继承Vector类,构造函数就是只有默认构造函数,构造空栈。

    package vector;
    
    import java.util.Enumeration;
    import java.util.Stack;
    
    public class StackClass {
    public static void main(String []args)
    {
        Stack <String>st=new Stack<String>();
    empty()和isEmpty()一毛一样 System.out.println(st.empty()); System.out.println(st.isEmpty());
    for(int i=0;i<10;i++) st.add("1"+i); for(String j:st) System.out.print(j+" "); System.out.println(); /*pop*/ 压入栈,返回这个值 System.out.println(st.pop()); /*push*/ 弹出栈,返回这个值 System.out.println(st.push("I'm")); System.out.println(st.push("Stack")); /*peek*/ 返回栈顶 System.out.println(st.peek()); Enumeration<String> e=st.elements(); while(e.hasMoreElements()) { System.out.print(e.nextElement()+" "); } System.out.println(); /*search*/ search倒着数的。。。 System.out.println(st.indexOf("18")); System.out.println(st.search("18")); } }

    4.LinkedList

    空构造函数和以Collection为参数的构造函数。

    API函数:

    boolean       add(E object)                                               
    void          add(int location, E object)                                 
    boolean       addAll(Collection<? extends E> collection)                  
    boolean       addAll(int location, Collection<? extends E> collection)    
    void          addFirst(E object)                 #####
    void          addLast(E object)                  #####
    void          clear()
    Object        clone()
    boolean       contains(Object object)
    Iterator<E>   descendingIterator()               #####
    E             element()                          //等於getFirst(),具體實現一樣
    E             get(int location)
    E             getFirst() 
    E             getLast()
    int           indexOf(Object object)
    int           lastIndexOf(Object object)
    ListIterator<E>     listIterator(int location)
    boolean       offer(E o)                      ####等于add、addFirst、addLast
    boolean       offerFirst(E e)                 ####
    boolean       offerLast(E e)                  ####
    E             peek()                  ##########
    E             peekFirst()          #########
    E             peekLast()           #######
    E             poll()              #########
    E             pollFirst()          ############
    E             pollLast()                 #######
    E             pop()                      ######
    void          push(E e)                 #######
    E             remove()
    E             remove(int location)
    boolean       remove(Object object)
    E             removeFirst()                    ##
    boolean       removeFirstOccurrence(Object o) ##
    E             removeLast()                    ##
    boolean       removeLastOccurrence(Object o) ##
    E             set(int location, E object)
    int           size()
    <T> T[]       toArray(T[] contents)
    Object[]     toArray()

     基本上没有什么可以讲解的了,值得注意的是两套增加、删除和访问头和尾的,以下转自博客园博主 “如果天空不死”

    其中poll()有和pollFirst()相同,与remove()对应;peek()与peekFirst(),与get()对应;offer()与add()类似。

    那么剩下只有descendingIterator()、removeFirstOccurrence()和removeLastOccurrence()了,descendingIterator与iterator完全相似(不是ListIterator,因为没有previous的方法),只是从后往前的迭代器。removeFirstOccurrence与remove完全相同,还与pop相同。注:push()与addFirst()完全相同。。。

    就剩下一个了removeLastOccurrence,作用是在链表中移除最后一个出现的该参数。

    以代码来详细分析一下add(int index,E element)

        public void add(int index, E element) {
            checkPositionIndex(index);
    
            if (index == size)
                linkLast(element);
            else
                linkBefore(element, node(index));
        }

     先来看checkPositionIndex()方法就是为了防止index出界,出界就抛出异常。

        private void checkPositionIndex(int index) {
            if (!isPositionIndex(index))
                throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
        }
    
        private boolean isPositionIndex(int index) {
            return index >= 0 && index <= size;
        }

    如果没越界,那判断是不是末尾,如果是使用LinkLast()方法将元素插到末尾,否则使用LinkBefore()插入到中间

        /**
         * Links e as last element.
         */
        void linkLast(E e) {
            final Node<E> l = last;                           //将末尾节点赋给l
            final Node<E> newNode = new Node<>(l, e, null);  //申请一个新的节点,prev是l,next是null
            last = newNode;                                  //将新节点变为末尾节点
            if (l == null)
                first = newNode;                            //l是null代表链表为空,那么头节点也是末尾节点
            else
                l.next = newNode;                          //否则l连接新节点
            size++;
            modCount++;
        }
    
        /**
         * Inserts element e before non-null Node succ.
         */
        void linkBefore(E e, Node<E> succ) {
            // assert succ != null;
            final Node<E> pred = succ.prev;                        
            final Node<E> newNode = new Node<>(pred, e, succ);           //申请一个新的节点,prev是pred,next是succ,元素是e
            succ.prev = newNode;                                         //Node构造函数就能指向其他节点,接下来是其他节点指向它,这句是指succ的prev指向新节点
            if (pred == null)
                first = newNode;                                      
            else 
                pred.next = newNode;                                  //pred的next指向新节点,不要弄反
            size++;
            modCount++;
        }

    LinkBefore()的第二个参数是node(index),作用是找到链表中下表为Index的节点并返回:

        Node<E> node(int index) {
            // assert isElementIndex(index);
    
            if (index < (size >> 1)) {                   //index小于size的一半就从头查找,否则从尾查找
                Node<E> x = first;
                for (int i = 0; i < index; i++)
                    x = x.next;
                return x;
            } else {
                Node<E> x = last;
                for (int i = size - 1; i > index; i--)
                    x = x.prev;
                return x;
            }
        }
  • 相关阅读:
    openfire部署文档(备用)
    WPS目录制作方法
    Spring.net Could not load type from string value问题解决办法
    [转载]线程间操作无效: 从不是创建控件“ListBox1”的线程访问它
    [转载].Net中如何操作IIS(源代码)
    [转载]DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)
    [转载]Sublime Text 2
    [转载]再谈iframe自适应高度
    js key事件 keyCode大全
    [转载]HTML5 Audio/Video 标签,属性,方法,事件汇总
  • 原文地址:https://www.cnblogs.com/lbrs/p/10057862.html
Copyright © 2011-2022 走看看