面试算法题(7)--写一个java类,实现栈的功能

写一个java类,实现栈的功能

之前面试碰到这个题,自己实现栈的功能。
首先我们的了解栈的特点,和栈Stack.java各个方法的含义:

1、栈是单出入口的数据结构,即出口和入口是共用的。
2、栈拥有后进先出的特点。

栈Stack.java源码方法分析:

/**
 * @author duke
 * @dateTime 2018-07-19 22:24
 * @description Stack源码,注意观察Stack继承了Vector类,基于list的实现
 */
public class Stack<E> extends Vector<E> {

    /**
     * 将item压入栈顶,功能和addElement等效
     */
    public E push(E item) {
        addElement(item);
        return item;
    }

    /**
     * 移除堆栈顶部的对象,并将该对象作为该函数的值返回。
     * 或者解释为:返回Vector集合的最后一个元素
     * @throws EmptyStackException 如果Stack为null则会抛出异常.
     */
    public synchronized E pop() {
        E obj;
        int len = size();
        obj = peek();
        removeElementAt(len - 1);
        return obj;
    }

    /**
     * 获取堆栈顶部的对象,而不将其从堆栈中移除。
     * 或者解释为:返回Vector集合的最后一个元素
     * @throws EmptyStackException 如果Stack为null则会抛出异常.
     */
    public synchronized E peek() {
        int len = size();
        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }

    /**
     * stack是否为null.
     */
    public boolean empty() {
        return size() == 0;
    }

    /**
     * 从栈顶开始寻找,查找当前项o到栈顶的距离。
     * 栈顶元素距离栈顶的距离为1,其他的以此类推。
     * 如果当前项o不在栈中,则返回-1.
     */
    public synchronized int search(Object o) {
        int i = lastIndexOf(o);
        if (i >= 0) {
            return size() - i;
        }
        return -1;
    }
}

了解了Stack继承自Vector,基于list的实现;
了解了Stack各个方法的含义。

我们可以开始动工了,撸代码:

/**
 * @author duke
 * @dateTime 2018-07-19 22:24
 * @description 去掉继承Vector,我们自己实现具体功能
 */
public class Stack<E> {
    private volatile ArrayList<E> list = new ArrayList<>();

    /**
     * 将item压入栈顶,功能和addElement等效
     */
    public E push(E item) {
        list.add(item);
        return item;
    }

    /**
     * 移除堆栈顶部的对象,并将该对象作为该函数的值返回。
     * 或者解释为:返回Vector集合的最后一个元素
     *
     * @throws EmptyStackException 如果Stack为null则会抛出异常.
     */
    public synchronized E pop() {
        E obj;
        int len = list.size();
        obj = peek();
        list.remove(len - 1);
        return obj;
    }

    /**
     * 获取堆栈顶部的对象,而不将其从堆栈中移除。
     * 或者解释为:返回Vector集合的最后一个元素
     *
     * @throws EmptyStackException 如果Stack为null则会抛出异常.
     */
    public synchronized E peek() {
        if (list.size() == 0) {
            return null;
        }
        return list.get(list.size() - 1);
    }

    /**
     * stack是否为null.
     */
    public boolean empty() {
        return list.size() == 0;
    }

    /**
     * 从栈顶开始寻找,查找当前项o到栈顶的距离。
     * 栈顶元素距离栈顶的距离为1,其他的以此类推。
     * 如果当前项o不在栈中,则返回-1.
     */
    public synchronized int search(Object o) {
        int size = list.size();
        int position = 1;
        for (int i = size - 1; i >= 0; i--) {
            if (o == list.get(i)) {
                return position;
            }
            position++;
        }
        return -1;
    }
}

最后才发现,其实没什么难度,去掉继承Vector,自己定义一个list实现对应的功能即可。
只好吐槽下,那些无聊的面试官。

猜你喜欢

转载自blog.csdn.net/fesdgasdgasdg/article/details/81124410
今日推荐