zoukankan      html  css  js  c++  java
  • 栈-用顺序映像实现栈

    (一).栈的理解 

      (1)概述:只在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有特殊含义,我们称之为栈顶(top),表头我们称之为栈底(bottom)。不含元素的空表称之为空栈.

                       

      

      (2)栈的顺序映像:植栈中元素实际在数组中存储,其线性关系,与普通线性表相同,通过元素紧邻来表示。

        a.入栈:

          这里要注意的只有一点,就是数组容量的问题,在元素入栈的时候,要保证数组中有位置来容纳,带入栈的元素

        b.出栈:

          这里要注意的也只有一点就是,此时,栈是否为空栈,如果是空栈,就无法出栈。

    (二)代码实现

     (1)首先定义一个Stack接口

    public interface Stack<T> {
        //返回栈的长度
        public int length();
    
        //入栈
        public void push(T elment);
    
        //出栈
        public  T pop();
    
        //取栈顶
        public T peek();
    
        //判断栈空
        public  boolean isEmpty();
    
        //清空栈
        public void clear();
    }
    interface Stack

     (2)然后定义一个类实现Stack接口

    public class SequeceStack<T> implements Stack<T> {
        private int DEFAULT_SIZE = 3;//定义栈默认初始长度
        private int capacity;//顺序栈的容量
        private int size ;//顺序栈中元素个数
        private static String[] elements;//定义一个数组用于保存顺序栈中的元素
    
        public SequeceStack() {
            capacity = DEFAULT_SIZE;
            elements = new String[capacity];
        }
    
        /**
         * 以指定的容量来初始化栈
         * @param initsize 指定的容量
         */
        public SequeceStack(int initsize) {
            if(initsize < 0 || initsize > Integer.MAX_VALUE-8){
                throw new OutofSizeException("容量不合法");
            }
            else{
                int capacity = 1;
                while ( capacity < initsize){
                    capacity <<= 1;
                }
                elements = new String[capacity];
                this.capacity = capacity;//caution扩容的关键
            }
    
        }
    
        ///////////////////// 下面是栈的各项功能 /////////////////////
        /**
         * 获取栈中元素个数
         * @return 获取的元素个数
         */
        @Override
        public int length() {
            return size;
        }
    
        /**
         * 入栈
         * @param s 要入栈的元素
         */
        @Override
        public void push(T s) {
            //判断是否需要扩容
            ensureCapacity(size + 1);
            elements[size++] = (String) s;
        }
    
        private void ensureCapacity(int minCapacity) {
            //是否需要扩容
            if(minCapacity > capacity){
                //需要扩容
                while (minCapacity < capacity){
                    minCapacity <<= 1;
                }
                //将旧数组的所有元素拷贝到扩容后的新数组
                elements = Arrays.copyOf(elements,minCapacity);
            }
        }
    
        /**
         * 出栈
         * @return 出栈的那个元素
         */
        @Override
        public T pop() {
            if(isEmpty()){
                throw new ArrayIndexOutOfBoundsException("栈为空");
            }else {
                T oldValue = (T) elements[size - 1];
                elements[--size] = null;
            return oldValue;
            }
        }
    
        /**
         * 获取栈顶元素
         * @return 获取到的栈顶元素
         */
        @Override
        public T peek() {
            if(size == 0){
                throw new ArrayIndexOutOfBoundsException("这是个空栈");
            }
            return (T) elements[size - 1];
        }
    
        /**
         * 判断栈是否为空
         * @return 如果栈为空,返回ture,否则返回false
         */
        @Override
        public boolean isEmpty() {
            return size == 0;
        }
    
        /**
         * 清空栈
         */
        @Override
        public void clear() {
            for (int i = 0; i < size; i++) {
                elements[i] = null;
            }
            size = 0;
        }
    
        /**
         * 打印栈所有元素
         * @return 打印的内容
         */
        @Override
        public String toString() {
            if(size == 0){
                return "[]";
            }else {
                StringBuilder sb = new StringBuilder();
                sb.append("[");
                for (int i = 0; i < size; i++) {
                    sb.append(elements[i] + ", ");
                }
                int len = sb.length();
                return sb.delete(len - 2,len).append("]").toString();
            }
        }
    }
    SequeceStack
    (3)最后定义一个测试类
    public class SequenceStackTest {
          public static void main(String[] args) {
             SequeceStack ss = new SequeceStack();
             System.out.println("-------------初始化一个空栈-------------");
             System.out.println("栈空:" + ss.isEmpty());
             System.out.println("打印栈:" + ss.toString());
             System.out.println("栈中元素个数:" + ss.length());
      
             System.out.println("-------------存储三个元素后-------------");
             ss.push("hello");
             ss.push("world");
             ss.push("java");
             System.out.println("栈空:" + ss.isEmpty());
             System.out.println("打印栈:" + ss.toString());
             System.out.println("栈中元素个数:" + ss.length());
     
             System.out.println("-----------获取栈顶元素,但不删除栈顶元素-----------");
             System.out.println("获取到的栈顶元素为:" + ss.peek());
             System.out.println("打印栈:" + ss.toString());
             System.out.println("栈中元素个数:" + ss.length());
     
             System.out.println("-------------将栈顶元素出栈----------------");
             System.out.println("栈顶出栈的元素为:" +ss.pop());
             System.out.println("打印栈:" + ss.toString());
             System.out.println("栈中元素个数:" + ss.length());
     
             System.out.println("-------------清空栈---------------");
             ss.clear();
             System.out.println("栈空:" + ss.isEmpty());
             System.out.println("打印栈:" + ss.toString());
             System.out.println("栈中元素个数:" + ss.length());
     
             System.out.println("-------------当存储元素个数大于4个元素时,需要扩容-------------");
             ss.push("hello");
             ss.push("world");
             ss.push("java");
             ss.push("chongqing");
             System.out.println("打印栈:" + ss.toString());
             System.out.println("栈中元素个数:" + ss.length());
         }
     }
    SequenceStackTest
    (4)当然,这里我自己自定义了一个异常
    public class OutofSizeException extends RuntimeException {
         public OutofSizeException() {
         }
     
         public OutofSizeException(String message) {
             super(message);
         }
     }
    OutofSizeException
    (5)运行结果:


  • 相关阅读:
    Python 使用gevent下载图片案例
    Python 使用gevent实现多任务
    Python 生成器
    Python 自己实现可迭代对象
    Python 遍历文件夹清理磁盘案例
    Python 多进程拷贝文件夹案例
    Python 多进程编程
    Python 多线程编程
    Python TCP通信之仿文件下载
    Python UDP 通信
  • 原文地址:https://www.cnblogs.com/bug-baba/p/10509926.html
Copyright © 2011-2022 走看看