【算法】Java手写实现栈

栈是什么

Stack是Java中常用的数据结构之一,Stack具有"后进先出(LIFO)"的性质。 只能在一端进行插入或者删除,即压栈与出栈。可以使用数组实现。
栈的特点:
入栈的时候,只在数组尾部插入
出栈的时候,只在数组尾部删除
在这里插入图片描述

栈的实现

package com;

import java.util.Arrays;

public class MyStack<E> {
    
    
    //底层是数组
    private Object[] elements;

    //栈的个数
    private int size = 0;

    public MyStack() {
    
    
        this(10);
    }

    public MyStack(int capacity) {
    
    
        if(capacity <= 0){
    
    
            throw new RuntimeException("初始化容量错误");
        }
        elements =new Object[capacity];
    }

    /**
     * 将一个元素压入栈中
     * @param e
     */
    public void push(E e){
    
    
        //如果栈已满,进行扩容
        if(size >= elements.length){
    
    
            grow();
        }
        elements[size++] = e;
    }

    /**
     * 扩容
     */
    private void grow() {
    
    
        //将之前的数组保存
        int oldCapacity = elements.length;
        Object[] old = elements;
        //新的数组大小为原来数组大小的2倍
        int newCapacity = oldCapacity * 2;
        //再新建一个大小为原来数组2倍的新数组
        elements = new Object[newCapacity];
        //把以前的老的数组中的元素都移动新数组中
        for (int i = 0; i < oldCapacity; i++) {
    
    
            elements[i] = old[i];
        }
        //释放以前的内存空间
        old = null;
    }

    /**
     * 出栈,就是将数组最后一个元素弹出
     * @return
     */
    public Object pop(){
    
    
        if(isEmpty()){
    
    
           return null;
        }
        E e = peek();
        elements[--size] = null;
       return e;
    }

    /**
     * 返回最后一个元素
     * @return
     */
    public E peek(){
    
    
        int len = size();
        if(len == 0){
    
    
            throw new RuntimeException("stack is empty");
        }
        return (E)elements[len - 1];
    }

    public int size(){
    
    
        return size;
    }

    public boolean isEmpty(){
    
    
        return size == 0;
    }

    public void print(){
    
    
        System.out.print(Arrays.toString(elements)+"\n");
    }

    public static void main(String[] args) {
    
    
        MyStack<String> myStack = new MyStack();
        myStack.push("a");
        myStack.push("b");
        myStack.push("c");
        myStack.push("d");
        myStack.push("e");
        myStack.print();
        System.out.println(myStack.pop());
        myStack.print();
        System.out.println(myStack.peek());
        System.out.println(myStack.pop());
        myStack.print();
        System.out.println(myStack.pop());
        myStack.print();
        myStack.push("f");
        System.out.println(myStack.peek());
        myStack.print();
        System.out.println("栈小大:"+myStack.size());
        System.out.println("栈是否为空:"+myStack.isEmpty());
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xiaowanzi_zj/article/details/127142646