zoukankan      html  css  js  c++  java
  • java代码实现自定义栈 + 时间复杂度分析

    如果是还不知道栈是啥玩意的同学们请查看我在CSDN写的一篇关于栈的博客:

    https://blog.csdn.net/qq_43059674/article/details/86567733

    自定义栈java实现代码:

    接口定义:

    /**
     * 定义栈接口
     * 
     * @author 20190313
     *
     */
    public interface Stack<T> {
    
        /**
         * 当前栈是否为空
         * @return
         */
        public boolean isEmpty();
        
        
        /**
         * 返回当前栈顶元素,但不出栈
         * @return
         */
        public T peek() ;
        
        
        /**
         * 当前栈顶元素出栈
         * @return
         */
        public T pop();
        
        
        /**
         * 元素入栈
         * @param element
         */
        public void push(T element);
    
        /**
         * 返回当前栈中的元素个数
         * @return
         */
        public int size();
        
        
        /**
         * 清空当前栈
         */
        public void clear();
        
        
        
    }

    实现类,底层使用的是数组实现

    /**
     * 实现了定义栈的接口 Stack 该实现类基于数组 属于顺序栈
     * @author 20190313
     *
     */
    public class ArrayStack<T> implements Stack<T> {
        private final int DEFAULT_SIZE = 3;
        private int size = 0;
        private int capactiy = 0;
    
        // top指向下一个能添加元素的位置
        private int top = 0;
        private Object[] array;
    
        public ArrayStack() {
            // TODO Auto-generated constructor stub
            this.capactiy = this.DEFAULT_SIZE;
            this.array = new Object[this.capactiy];
        }
    
        public ArrayStack(int capactiy) {
            // TODO Auto-generated method stub
            this.capactiy = capactiy;
            this.array = new Object[capactiy];
        }
    
        @Override
        public boolean isEmpty() {
            // TODO Auto-generated method stub
            return size == 0;
        }
    
        @Override
        public T peek() {
            // TODO Auto-generated method stub
            return (T) this.array[this.top - 1];
        }
    
        @Override
        public T pop() {
            // TODO Auto-generated method stub
            T element = (T) this.array[top - 1];
            this.array[top--] = null;
            this.size--;
            return element;
        }
    
        @Override
        public void push(T element) {
            // TODO Auto-generated method stub
            if (this.size < this.capactiy) {
                this.array[top] = element;
                this.top++;
                this.size++;
            } else {
                enlarge();
                push(element);
            }
        }
    
        /**
         * 扩容的方法
         */
        private void enlarge() {
            this.capactiy = this.capactiy + this.DEFAULT_SIZE;
            Object[] newArray = new Object[this.capactiy];
            System.arraycopy(array, 0, newArray, 0, array.length);
            // 把旧的array用null填充
            Arrays.fill(array, null);
            this.array = newArray;
    
        }
    
        @Override
        public int size() {
            // TODO Auto-generated method stub
            return size;
        }
    
        @Override
        public void clear() {
            // TODO Auto-generated method stub
            Arrays.fill(array, null);
            this.top = 0;
            this.size = 0;
            this.capactiy = this.DEFAULT_SIZE;
            this.array = new Object[this.capactiy];
        }
    }

    下面是栈方法的时间复杂度分析

    哈,时间复杂度比较简单 除入栈外时间复杂度都为 O(1),下面我们看看入栈的时间复杂度,如果空间足够时间复杂度为O(1),但如果当前容量不足发生扩容那么时间复杂度就为O(n),

    也就是说,对于入栈操作来说,最好情况时间复杂度是 O(1),入栈的平均复杂度通关均摊法可以得出为O(1)

  • 相关阅读:
    算法竞赛入门经典习题2-3 韩信点兵
    ios入门之c语言篇——基本函数——5——素数判断
    ios入门之c语言篇——基本函数——4——数值交换函数
    144. Binary Tree Preorder Traversal
    143. Reorder List
    142. Linked List Cycle II
    139. Word Break
    138. Copy List with Random Pointer
    137. Single Number II
    135. Candy
  • 原文地址:https://www.cnblogs.com/IT-CPC/p/10885941.html
Copyright © 2011-2022 走看看