zoukankan      html  css  js  c++  java
  • java.util.Stack类简介(栈)

    Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来

    Deque(双端队列)比起stack具有更好的完整性和一致性,应该被优先使用

     1  E push(E item) 
     2           把项压入堆栈顶部。 
     3  E pop() 
     4           移除堆栈顶部的对象,并作为此函数的值返回该对象。 
     5  E peek() 
     6           查看堆栈顶部的对象,但不从堆栈中移除它。 
     7  boolean empty() 
     8           测试堆栈是否为空。  
     9  int search(Object o) 
    10           返回对象在堆栈中的位置,以 1 为基数。

    Stack本身通过扩展Vector而来,而Vector本身是一个可增长的对象数组( a growable array of objects)那么这个数组的哪里作为Stack的栈顶,哪里作为Stack的栈底?

    答案只能从源代码中寻找,jdk1.6

     1 public class Stack<E> extends Vector<E> {
     2     /**
     3      * Creates an empty Stack.
     4      */
     5     public Stack() {
     6     }
     7 
     8     /**
     9      * Pushes an item onto the top of this stack. This has exactly
    10      * the same effect as:
    11      * <blockquote><pre>
    12      * addElement(item)</pre></blockquote>
    13      *
    14      * @param   item   the item to be pushed onto this stack.
    15      * @return  the <code>item</code> argument.
    16      * @see     java.util.Vector#addElement
    17      */
    18     public E push(E item) {
    19     addElement(item);
    20 
    21     return item;
    22     }
    23 
    24     /**
    25      * Removes the object at the top of this stack and returns that
    26      * object as the value of this function.
    27      *
    28      * @return     The object at the top of this stack (the last item
    29      *             of the <tt>Vector</tt> object).
    30      * @exception  EmptyStackException  if this stack is empty.
    31      */
    32     public synchronized E pop() {
    33     E    obj;
    34     int    len = size();
    35 
    36     obj = peek();
    37     removeElementAt(len - 1);
    38 
    39     return obj;
    40     }
    41 
    42     /**
    43      * Looks at the object at the top of this stack without removing it
    44      * from the stack.
    45      *
    46      * @return     the object at the top of this stack (the last item
    47      *             of the <tt>Vector</tt> object).
    48      * @exception  EmptyStackException  if this stack is empty.
    49      */
    50     public synchronized E peek() {
    51     int    len = size();
    52 
    53     if (len == 0)
    54         throw new EmptyStackException();
    55     return elementAt(len - 1);
    56     }
    57 
    58     /**
    59      * Tests if this stack is empty.
    60      *
    61      * @return  <code>true</code> if and only if this stack contains
    62      *          no items; <code>false</code> otherwise.
    63      */
    64     public boolean empty() {
    65     return size() == 0;
    66     }
    67 
    68     /**
    69      * Returns the 1-based position where an object is on this stack.
    70      * If the object <tt>o</tt> occurs as an item in this stack, this
    71      * method returns the distance from the top of the stack of the
    72      * occurrence nearest the top of the stack; the topmost item on the
    73      * stack is considered to be at distance <tt>1</tt>. The <tt>equals</tt>
    74      * method is used to compare <tt>o</tt> to the
    75      * items in this stack.
    76      *
    77      * @param   o   the desired object.
    78      * @return  the 1-based position from the top of the stack where
    79      *          the object is located; the return value <code>-1</code>
    80      *          indicates that the object is not on the stack.
    81      */
    82     public synchronized int search(Object o) {
    83     int i = lastIndexOf(o);
    84 
    85     if (i >= 0) {
    86         return size() - i;
    87     }
    88     return -1;
    89     }
    90 
    91     /** use serialVersionUID from JDK 1.0.2 for interoperability */
    92     private static final long serialVersionUID = 1224463164541339165L;
    93 }

    通过peek()方法注释The object at the top of this stack (the last item of the Vector object,可以发现

    数组(Vector)的最后一位即为Stack的栈顶

    pop、peek以及search方法本身进行了同步

    push方法调用了父类的addElement方法

    empty方法调用了父类的size方法

    Vector类为线程安全类

    综上,Stack类为线程安全类(多个方法调用而产生的数据不一致问题属于原子性问题的范畴)

     1 public class StackTest {
     2     public static void main(String[] args) {
     3         Stack<String> s = new Stack<String>();
     4         System.out.println("------isEmpty");  
     5         System.out.println(s.isEmpty());  
     6         System.out.println("------push");  
     7         s.push("1");  
     8         s.push("2");  
     9         s.push("3");  
    10         StackTest.t(s);  
    11         System.out.println("------pop");  
    12         String str = s.pop();  
    13         System.out.println(str);  
    14         StackTest.t(s);  
    15         System.out.println("------peek");  
    16         str = s.peek();  
    17         System.out.println(str);  
    18         StackTest.t(s);  
    19         System.out.println("------search");  
    20         int i = s.search("2");  
    21         System.out.println(i);  
    22         i = s.search("1");  
    23         System.out.println(i);  
    24         i = s.search("none");  
    25         System.out.println(i); 
    26     }
    27     
    28     public static void t(Stack<String> s){
    29         System.out.println("iterator");
    30         Iterator<String> it = s.iterator();
    31         while(it.hasNext()){
    32             System.out.print(it.next()+"    ");
    33         }
    34         System.out.println("
    ");
    35     }
    36 }

    结果:

     1 ------isEmpty
     2 true          
     3 ------push
     4 iterator:1;2;3;  
     5 ------pop
     6 3        --栈顶是数组最后一个
     7 iterator:1;2;
     8 ------peek
     9 2        --pop取后删掉,peek只取不删
    10 iterator:1;2;
    11 ------search    
    12 1        --以1为基数,即栈顶为1
    13 2        --和栈顶见的距离为2-1=1
    14 -1        --不存在于栈中

    Stack并不要求其中保存数据的唯一性,当Stack中有多个相同的item时,调用search方法,只返回与查找对象equal并且离栈顶最近的item与栈顶间距离(见源码中search方法说明)

  • 相关阅读:
    Oracle冷备份需要保存的文件
    oracle 重建 sys密码文件
    ORA-01991错误
    oracle ORA-01033问题怎么解决
    oracle创建表空间
    oracle 10G服务器端安装以及冷备份恢复
    完全卸载oracle11g步骤
    42. 函数指针用在菜单驱动系统中,练习函数指针数组的使用。
    41. 定义与调用一个函数指针时的几种方式
    40. 使用数组时的四个要点
  • 原文地址:https://www.cnblogs.com/wdpnodecodes/p/7406175.html
Copyright © 2011-2022 走看看