欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JAVA Stack详细介绍和示例学习

程序员文章站 2024-02-13 10:35:52
第1部分 stack介绍stack是栈。它的特性是:先进后出(filo, first in last out)。java工具包中的stack是继承于vector(矢量队列)...
第1部分 stack介绍
stack是栈。它的特性是:先进后出(filo, first in last out)。
java工具包中的stack是继承于vector(矢量队列)的,由于vector是通过数组实现的,这就意味着,stack也是通过数组实现的,而非链表。当然,我们也可以将linkedlist当作栈来使用!

stack的继承关系
JAVA Stack详细介绍和示例学习
stack和collection的关系如下图:
JAVA Stack详细介绍和示例学习
stack的构造函数
stack只有一个默认构造函数,如下:
复制代码 代码如下:

stack()
 

stack的api
复制代码 代码如下:

stack是栈,它常用的api如下:
             boolean       empty()
synchronized e             peek()
synchronized e             pop()
             e             push(e object)
synchronized int           search(object o)

由于stack和继承于vector,因此它也包含vector中的全部api。
 第2部分 stack源码解析
stack的源码非常简单,下面我们对它进行学习。
复制代码 代码如下:

package java.util;
public
class stack<e> extends vector<e> {
    // 版本id。这个用于版本升级控制,这里不须理会!
    private static final long serialversionuid = 1224463164541339165l;
    // 构造函数
    public stack() {
    }
    // push函数:将元素存入栈顶
    public e push(e item) {
        // 将元素存入栈顶。
        // addelement()的实现在vector.java中
        addelement(item);
        return item;
    }
    // pop函数:返回栈顶元素,并将其从栈中删除
    public synchronized e pop() {
        e    obj;
        int    len = size();
        obj = peek();
        // 删除栈顶元素,removeelementat()的实现在vector.java中
        removeelementat(len - 1);
        return obj;
    }
    // peek函数:返回栈顶元素,不执行删除操作
    public synchronized e peek() {
        int    len = size();
        if (len == 0)
            throw new emptystackexception();
        // 返回栈顶元素,elementat()具体实现在vector.java中
        return elementat(len - 1);
    }
    // 栈是否为空
    public boolean empty() {
        return size() == 0;
    }
    // 查找“元素o”在栈中的位置:由栈底向栈顶方向数
    public synchronized int search(object o) {
        // 获取元素索引,elementat()具体实现在vector.java中
        int i = lastindexof(o);
        if (i >= 0) {
            return size() - i;
        }
        return -1;
    }
}

总结:
(01) stack实际上也是通过数组去实现的。
       执行push时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。
       执行peek时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。
       执行pull时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。
(02) stack继承于vector,意味着vector拥有的属性和功能,stack都拥有。

第3部分 vector示例
下面我们通过实例学习如何使用stack
复制代码 代码如下:

import java.util.stack;
import java.util.iterator;
import java.util.list;
/**
 * @desc stack的测试程序。测试常用api的用法
 *
 * @author skywang
 */
public class stacktest {
    public static void main(string[] args) {
        stack stack = new stack();
        // 将1,2,3,4,5添加到栈中
        for(int i=1; i<6; i++) {
            stack.push(string.valueof(i));
        }
        // 遍历并打印出该栈
        iteratorthroughrandomaccess(stack) ;
        // 查找“2”在栈中的位置,并输出
        int pos = stack.search("2");
        system.out.println("the postion of 2 is:"+pos);
        // pup栈顶元素之后,遍历栈
        stack.pop();
        iteratorthroughrandomaccess(stack) ;
        // peek栈顶元素之后,遍历栈
        string val = (string)stack.peek();
        system.out.println("peek:"+val);
        iteratorthroughrandomaccess(stack) ;
        // 通过iterator去遍历stack
        iteratorthroughiterator(stack) ;
    }
    /**
     * 通过快速访问遍历stack
     */
    public static void iteratorthroughrandomaccess(list list) {
        string val = null;
        for (int i=0; i<list.size(); i++) {
            val = (string)list.get(i);
            system.out.print(val+" ");
        }
        system.out.println();
    }
    /**
     * 通过迭代器遍历stack
     */
    public static void iteratorthroughiterator(list list) {
        string val = null;
        for(iterator iter = list.iterator(); iter.hasnext(); ) {
            val = (string)iter.next();
            system.out.print(val+" ");
        }
        system.out.println();
    }
}