数据结构 栈

  1. 基本讲解
    1. 可以把栈理解成一个放那种很大很重的书的箱子,每本书的长宽和箱子的尺寸一样,每当向这个箱子放书的时候,第一本是放到最底下的,然后依次往上放,每次取书的时候,都是从上往下取的,这也就是“先进后出”。
  2. 算法的基本原理
    1. 就是用一个Object数组来充当栈的内容,再定义栈顶指针,一个栈底指针。每次压栈的时候就元素放到数组[栈顶指针]的位置,每次出栈的时候就把数组[栈顶指针]的值弹出来就可以了
  3. 代码
    package learning.stark;
    
    
    import java.util.LinkedList;
    import java.util.List;
    
    public class StarkTest {
    
    
        public static void main(String []args){
            StarkTest starkTest = new StarkTest();
            Stark stark =  starkTest.initStark();
            stark =  starkTest.pushSatrk(stark, 3);
            stark =  starkTest.pushSatrk(stark, "23");
            List<Object> result =  starkTest.popStark(stark);
            System.out.println(result.get(1));
            result =  starkTest.popStark((Stark) result.get(0));
            System.out.println(result.get(1));
        }
    
    
        private Stark initStark(){
            Object []starkContent = new Object[5];
            int bottom = 0;
            int top = 0;
           return  new Stark(starkContent,top, bottom);
        }
    
        private Stark pushSatrk(Stark stark, Object ele){
          Object []starkContent = stark.getContent();
          int top = stark.getTop();
          starkContent[top] = ele;
          top = top + 1;
          int bottom = stark.getBottom();
          return new Stark(starkContent, top , bottom);
        }
    
        private List<Object> popStark(Stark stark){
            Object []starkContent = stark.getContent();
            int top = stark.getTop();
            top = top - 1;
            int bottom = stark.getBottom();
            List<Object> result = new LinkedList<Object>();
            result.add(new Stark(starkContent, top, bottom));
            result.add(starkContent[top]);
            return result;
        }
    
    
    }
    

     

  4. 优化版,去掉了显示声明的栈顶指针和栈底指针,取而代之的是使用新的数组代替原来的数组(新的数组的长度比原来的数组长度加一或者减一来模拟栈顶指针的移动)

    package learning.stark;
    
    /**
     * 算法:
     *      1、声明了一个数组成员变量,然后通过操作这个成员变量来实现栈的相关的操作
     *      2、压栈: 用一个比原来数组长度多一的数组代替原来的数组,并且把最后一个元素设置为压栈的值
     *      3、弹出:将数组的最后一个元素返回,并且将数组的长度减一
     *      4、查看元素:返回数组的最后最后一个元素
     *      4、判空: 判断数组的长度是否为0
     */
    public class StarkByTeacher {
        private int []elements = new int[0];
    
        public void push(int ele){
            int[] newArray = new int[elements.length + 1];
            for(int i = 0; i < elements.length; i++ ){
                newArray[i] = elements[i];
            }
            elements = newArray;
            elements[elements.length - 1] = ele;
        }
    
        public int pop(){
            if(elements.length == 0){
                throw  new RuntimeException("stark is empty");
            }
            int result = elements[elements.length -1];
            int newArr[] = new int[elements.length -1];
            for(int i=0; i< newArr.length; i++){
                newArr[i] =  elements[i];
            }
            elements = newArr;
            return result;
        }
    
        public int peek(){
            if(elements.length == 0){
                throw new RuntimeException("stark is empty");
            }
            return elements[elements.length - 1];
        }
    
        public boolean isEmpty(){
            return elements.length == 0;
        }
    
    }
    

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值