前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【数据结构】关于栈你必须知道的内部原理!!!

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

作者头像
用户11288949
发布2024-09-24 13:42:35
550
发布2024-09-24 13:42:35
举报
文章被收录于专栏:用户11288949的专栏

📚️1.栈的概念

🎥1.1什么是栈??

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

🎥1.2什么入栈??

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

🎥1.3什么出栈??

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

图片如下:

总之一句话,放数据和出数据都在一个口,就像喝水一样,加水和喝水都在水面。 当然你插吸管当小编没说~~~😄😄😄

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

冲冲冲~~~💪💪💪

📚️ 2.栈的模拟实现

🎥引导

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

🎥2.1栈的初始化

代码如下:

代码语言:javascript
复制
public class MyStack {
    private int []elem;
    private int usedSize=0;
    public MyStack(int Range){
        this.elem=new int[Range];
    }

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

🎥2.2判断栈是否为空

代码如下:

代码语言:javascript
复制
   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入栈操作

代码如下:

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

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

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

🎥2.4出栈操作

代码如下:

代码语言:javascript
复制
public int pop(){
        if(isEmpty()){
            System.out.println("栈为空,不能出栈");
            return -1;
        }
        int ret=elem[usedSize-1];
        usedSize--;
        return ret;
    }

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

🎥2.5输出栈顶元素

代码如下:

代码语言:javascript
复制
 public int peek(){
        if(isEmpty()){
            System.out.println("栈为空,没有栈顶元素");
            return -1;
        }
        return elem[usedSize-1];
    }

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

🎥2.6长度,扩容,打印

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

代码如下:

代码语言:javascript
复制
    //求长度
    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.栈的使用

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

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

代码语言:javascript
复制
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.总结语

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


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

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

😊😊 期待你的关注~~~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 📚️1.栈的概念
    • 🎥1.1什么是栈??
      • 🎥1.2什么入栈??
        • 🎥1.3什么出栈??
        • 📚️ 2.栈的模拟实现
          • 🎥引导
            • 🎥2.1栈的初始化
              • 🎥2.2判断栈是否为空
                • 🎥2.3入栈操作
                  • 🎥2.4出栈操作
                    • 🎥2.5输出栈顶元素
                      • 🎥2.6长度,扩容,打印
                      • 📚️3.栈的使用
                      • 📚️4.总结语
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档