【数据结构】关于栈你必须知道的内部原理!!!

前言:

🌟🌟Hello家人们,小编这期将带来关于栈的相关知识,以及代码的实现,希望能够帮到屏幕前的你。

📚️上期双链表博客在这里哟:http://t.csdnimg.cn/xgjK1

📚️感兴趣的小伙伴可以关注小编哟:GGBondlctrl-CSDN博客

                                         好了那么言归正传,咱们开始吧 ~~~~🎥🎥🎥

目录

       📚️1.栈的概念

🎥1.1什么是栈??

🎥1.2什么入栈??

🎥1.3什么出栈??

      📚️ 2.栈的模拟实现

 🎥引导

🎥2.1栈的初始化

🎥2.2判断栈是否为空

🎥2.3入栈操作

 🎥2.4出栈操作

 🎥2.5输出栈顶元素

 🎥2.6长度,扩容,打印

      📚️3.栈的使用

      📚️4.总结语


       📚️1.栈的概念

🎥1.1什么是栈??

        栈一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。

🎥1.2什么入栈??

        栈的插入操作叫入栈(入数据在栈顶

🎥1.3什么出栈??

        栈的删除操作叫出栈(出数据在栈顶

图片如下:

总之一句话,放数据和出数据都在一个口,就像喝水一样,加水和喝水都在水面。

当然你插吸管当小编没说~~~😄😄😄

                             ok啊,了解了栈的基本原理,咱们就代码模拟一下吧~~~

                                                       冲冲冲~~~💪💪💪

      📚️ 2.栈的模拟实现

 🎥引导

        不难看出,上图所示栈是否像一个数组,0下标为栈的栈底索引,而且数据个数减去1,就是栈顶元素的下标索引,那么我们就有以下操作。

🎥2.1栈的初始化

代码如下:

public class MyStack {
    private int []elem;
    private int usedSize=0;
    public MyStack(int Range){
        this.elem=new int[Range];
    }

       在代码中我们实现数组,和设定一个代表数据个数的变量,这里在构造函数中实现数组初始化的优点是,可以在实例化对象时,自动初始话我们想要的数组以及大小。

🎥2.2判断栈是否为空

代码如下:

   public boolean isFull(){     //判断栈是否为满
        if (usedSize== elem.length){
            return true;
        }
        return false;
    }
    //判断是否为空
    public boolean isEmpty(){
        if (usedSize==0){
            return true;
        }
        return false;
    }

       在几乎所有的数组实现和链表实现中,都要进行越界处理,在此代码中当数据个数等于数组的长度时就表示栈满了,当数据个数为0时,就表示栈为空。(这里的usedSize很关键)。

🎥2.3入栈操作

代码如下:

 public int push(int e){
        if(isFull()){      //在加入数据时,判断栈是否为空
            ensureCapacity();
        }
        elem[usedSize]=e;  //加入数据
        usedSize++;        //有效数据个数加一
        return e;
    }

       这里小编多加了一个方法,表示扩容,然后加入数据,当然有效数据也得加一。

💡💡💡注意:扩容的前提是,栈满了;几乎所有的数据结构都要判断,像链表要判断节点是否存在空指针异常,数组判断索引是否越界.......

 🎥2.4出栈操作

代码如下:

public int pop(){
        if(isEmpty()){
            System.out.println("栈为空,不能出栈");
            return -1;
        }
        int ret=elem[usedSize-1];
        usedSize--;
        return ret;
    }

        和上述代码一样,首先判断栈是否为空,空了就不能出栈,否则就出栈顶元素,有效数据减去一。

 🎥2.5输出栈顶元素

代码如下:

 public int peek(){
        if(isEmpty()){
            System.out.println("栈为空,没有栈顶元素");
            return -1;
        }
        return elem[usedSize-1];
    }

       同样判断栈是否为空,然后返回栈顶元素,但是有效数据不变。

 🎥2.6长度,扩容,打印

           ~~~这几种方法小编就一笔带过咯

代码如下:

    //求长度
    public int size(){
        return usedSize;
    }

    //扩容
    private void ensureCapacity(){
        this.elem=Arrays.copyOf(this.elem,2*elem.length);
    }
    //打印
    public void display(){
        int index=0;
        while (index<usedSize){
            System.out.print(elem[index]+" ");
            index++;
        }
    }

       长度就是有效数据;扩容中要运用 Arrays.copyOf 来实现扩容,创建一个与原数组类型相同的新数组;在打印中,首先要遍历栈,然后通过索引进行打印。

      📚️3.栈的使用

                和前几期,链表,顺序表等都有类似的方法,但是栈的方法不多~~~

下面比起前面内容稍微较易,那就通过小编代码看看吧!!😁😁😁

Stack<Integer> stack=new Stack<>(); //构造一个空栈
        stack.push(1);  //入栈
        stack.push(2);
        stack.push(3);
        System.out.println(stack);
        stack.pop();     //出栈顶元素
        stack.peek();    //输出栈顶元素,但不出栈
        System.out.println(stack);
        System.out.println(stack.size());  //输出有效数据个数
        System.out.println(stack.empty()); //判断栈是否为空

这里小编注加了解释,小编就不再过多赘述了。

输出情况:

[1, 2, 3]
[1, 2]
2
false

      📚️4.总结语

       理解底层代码原理有助于我们理解并使用方法时更加得心应手,并且小编觉得数据结构学习中要多练,多写。最后小编希望与君共勉!!!🌅🌅🌅


                 💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                                下期预告:【数据结构】之队列🌟🌟

                                          😊😊  期待你的关注~~~

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值