栈Stack的相关操作(java)

来源:互联网 发布:npm 淘宝 编辑:程序博客网 时间:2024/06/03 09:10
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package arthur.datastruct.programe;


import java.util.*;


/**
 *
 * @author dell
 */
public class MyStack {


    private int size;//栈中元素的个数
    private Object[] elements;//栈数组
    private final int DEFAULT_CAPACITY = 10;//栈默认的大小


    public MyStack() {
        this.size = 0;
        elements = new Object[DEFAULT_CAPACITY ];
    }


    /**
     * 返回栈中元素的个数
     * @return 
     */
    public int size() {
        return size;
    }


    /**
     * 判断栈是否为空
     * @return 
     */
    public boolean empty() {
        return 0 == size();
    }


    /**
     * 返回栈的首部但不移除首部元素
     * @return 
     */
    public Object peek() {
        if (this.empty()) {
            throw new EmptyStackException();
        }
        int index = size;
        return elements[--index];
    }


    /**
     *  移除堆栈顶部的对象,并作为此函数的值返回该对象。
     * @return 
     */
    public Object pop() {
        Object object = this.peek();
        int index = size;
        remove(--index);
        return object;
    }


    /**
     * 删除索引为index的那个元素
     * @param index 
     */
    public void remove(int index) {


        if (index >= size()) {
            throw new ArrayIndexOutOfBoundsException(index + " >= "
                    + size());
        } else if (index < 0) {
            throw new ArrayIndexOutOfBoundsException(index);
        }
        
        int j = size - index - 1;//得到位于索引index之后的元素的下标
        if(j>0)//如果下标存在
            System.arraycopy(elements, index+1, elements, index, j);
            
        elements[--size] = null;    
    }


    /**
     * 入栈操作,把项压入堆栈顶部。
     * @param object
     * @return 
     */
    public Object push(Object object) {
        if(null==object)
            throw new NullPointerException();
        if (this.size > elements.length) {
            this.doubleCapacity();
        }


        elements[size++] = object;
        return object;
    }




    /**
     * 扩充栈的空间,如果栈满了,就把空间扩从为原来的二倍
     * @return 
     */
    private void doubleCapacity() {
        int newCapacity = elements.length << 1;


        Object[] newElements = new Object[newCapacity];
        System.arraycopy(elements, 0, newElements, 0, elements.length);
        elements = newElements;
    }
    
    public static void main(String[] args){
        MyStack ms = new MyStack();
        ms.push(new Integer(2));
        ms.push(new Integer(4));
        System.out.println("size ==" + ms.size());
        System.out.println(ms.peek());
        
        System.out.println(ms.pop());
        System.out.println(ms.peek());
    }
}
原创粉丝点击