算法Java手写实现栈

Posted 泡^泡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法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());
    

以上是关于算法Java手写实现栈的主要内容,如果未能解决你的问题,请参考以下文章

两个队列实现一个栈 + 两个栈实现一个队列

《数据结构与算法之美》05——栈

Java手写原生的LRU算法

面试官让我手写队列,差点没写出来,回来后赶忙把重点记下来

面试官让我手写队列,差点没写出来,回来后赶忙把重点记下来

数据结构与算法--栈和队列