• 使用JAVA数组实现顺序栈


    1,首先总结一下线性表(分为顺序表和链接表,【即顺序存储结构和链式存储结构的区别】)和栈(顺序栈和链接栈)还有队列(顺序队列和链接队列)的JAVA类库中的实现:

    java.util.ArrayList 实现了顺序表,java.util.LinkedList 实现了链接表的功能。

    java.util.ArrayDeque实现了顺序栈和顺序队列(该类中即定义了与栈操作有关的方法,也定义了与队列操作有关的方法)、java.util.LinkedList实现了链接栈和链接队列。

    2,定义了一个Stack<E>接口,指明该栈实现了哪些具体的操作。接口如下:

     1 public interface Stack<E> {
     2     public int length();//返回栈的长度
     3     
     4     public E pop();//出栈
     5     
     6     public void push(E element);//进栈
     7     
     8     public E peek();//访问栈顶元素
     9     
    10     public boolean empty();//判断栈是否为空
    11     
    12     public void clear();//清空栈
    13 }

    3,在JAVA类库中,java.util.ArrayDeque类实现了顺序栈的功能。ArrayDeque可以实现动态地扩展栈的大小,但是不支持多线程访问。同时,ArrayDeque还实现了顺序队列的功能。

    4,定义了一个Object[] 类型的数组,用来保存顺序栈中的元素。具体实现类SequenceStack.java 如下:

    import java.util.Arrays;
    
    public class SequenceStack<E> implements Stack<E> {
        
        private int DEFAULT_SIZE = 16;//定义栈的初始默认长度
        private int capacity;//保存顺序栈的长度
        private int size;//保存顺序栈中元素的个数
        private Object[] elementData;//定义一个数组用于保存顺序栈中的元素
        
        public SequenceStack() {
            capacity = DEFAULT_SIZE;
            elementData = new Object[capacity];
        }
        
        //以指定的大小来创建栈
        public SequenceStack(int initSize){
            capacity = 1;
            while(capacity < initSize)
                capacity <<= 1;//将capacity设置成大于initSize的最小2次方
            elementData = new Object[capacity];
        }
    
        //返回当前顺序栈中元素的个数
        public int length() {
            return size;
        }
    
        public E pop() {
            if(empty())
                throw new IndexOutOfBoundsException("栈空,不能出栈");
            E oldValue = (E)elementData[size - 1];
            elementData[--size] = null;//让垃圾回收器及时回收,避免内存泄露
            return oldValue;
        }
    
        public void push(E element) {
            ensureCapacity(size + 1);
            elementData[size++] = element;
        }
        
        private void ensureCapacity(int minCapacity){
            if(minCapacity > capacity){
                while(capacity < minCapacity)
                    capacity <<= 1;
            elementData = Arrays.copyOf(elementData, capacity);
            }
        }
    
        //获取栈顶元素,不会将栈顶元素删除
        public E peek() {
            if(size == 0)
                throw new ArrayIndexOutOfBoundsException("栈为空");
            return (E)elementData[size - 1];
        }
    
        public boolean empty() {
            return size == 0;
        }
    
        public void clear() {
    //        Arrays.fill(elementData, null);
            for(int i = 0; i < size; i++)
                elementData[i] = null;
            size = 0;
        }
    
        public String toString(){
            if(size == 0)
                return "[]";
            else{
                StringBuilder sb = new StringBuilder("[");
                for(int i = size - 1; i >= 0; i--)
                    sb.append(elementData[i].toString() + ", ");
                int len = sb.length();
                //删除由于上面for循环中最后添加的多余的两个字符 (一个是逗号,一个是空格符号)
                return sb.delete(len - 2, len).append("]").toString();
            }
        }
    }
  • 相关阅读:
    Linux常用指令全集
    js判断ie11浏览器
    javascript事件触发器fireEvent和dispatchEvent
    HTML5自定义属性对象Dataset简介
    CommonJS规范
    sql基本语法大全
    (七)make menuconfig
    (六)buildroot使用详解
    (二十一)Makefile例子
    (二十)ubuntu的recovery mode解决用户一些实际问题
  • 原文地址:https://www.cnblogs.com/hapjin/p/4442729.html
Copyright © 2020-2023  润新知