数据结构系列 线性表【重点】 “堆栈” Stack 系列精讲 和使用方法总结!⚡附推荐LeetCode经典练习题

❓什么是栈

0️⃣栈的应用

 在了解栈之前还是老样子,我们来看几个例子子弹压膛
这张图就是将子弹填装进弹夹相信大家都见过吧,虽然可能没在现实中见到,在很多影视剧中还是可以看到的,这个操作中,我们可以把弹夹看做一个栈,把子弹看做要压栈的数据,是不是很清晰明了。

子弹发射

在这里将子弹发射出去,就是进行的栈的弹出,也叫出栈。

1️⃣栈的定义

 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

2️⃣栈的结构

 栈就是一种可以看做是单向通道的线性结构,如上面的例子,弹夹就可以看作是一个栈,仅能从弹夹顶部进行装弹,也就是仅能从栈的一端进行数据的填充 也叫压栈,同样的道理,在出栈又叫弹栈的过程中也仅能从该方向弹出,手枪中的子弹在发射时,最后填装在弹夹顶部的子弹最早发射,而最早装填的子弹反而是在弹夹最底部,最后发射,即数据的弹栈和出栈也是先弹出栈顶最后压栈进来的数据。
栈的结构

画图技术比较菜,不过想表达的意思完全是表达清楚了。

💥栈的使用

这里主要是以Java为技术栈来梳理栈的使用方法的,只是使用的Java语言,但是无论什么语言对栈的结构都是不变的。

0️⃣栈的实例化

import java.util.Stack;

class Main{
    public static void main(String[] args) {
		Stack<Object> stack = new Stack<>();
	}
}

这里实例化了一个栈对象,Java中本身就已经实现了栈,所以只需要导入java.util.Stack文件即可。

2️⃣栈的方法

方法名返回值类型方法体描述
emptybooleanboolean empty()测试堆栈是否为空。为空则返回true
peekObjectObject peek( )查看堆栈顶部的对象并返回,但不从堆栈中移除它。
popObjectObject pop( )移除堆栈顶部的对象,并作为此函数的值返回该对象。
pushObjectObject push(Object element)把项压入堆栈顶部。
searchintint search(Object element)返回对象在堆栈中的位置,以 1 为基数。

🎈光脚造轮子

要求:使用数组完成对栈的实现,以及几种方法的实现.

/*
*   使用数组完成栈的相关内容
* */
public class ArrayStack {
    // 栈的大小
    public int size;
    // 存储的数据
    public int[] data;
    // 栈顶元素
    public int top;

    /*
    *   构造方法
    * */
    public ArrayStack(int size){
        this.size = size;
        this.data = new int[size];
        this.top = -1;
    }

    /*
    *   empty()方法
    * */
    public boolean empty(){
        return (top == -1);
    }

    /*
    *   peek()方法
    * */
    public int peek(){
        return data[top];
    }

    /*
    *   pop()方法
    * */
    public int pop(){
        int ret = data[top];
        top--;
        return ret;
    }

    /*
    *   push()方法
    * */
    public boolean push(int num){
        if(top < size) {
            top++;
            data[top] = num;
            return true;
        }
        return false;
    }

    /*
    *   search()方法
    *       以1为基数,从栈顶向栈底
    * */
    public int search(int target){
        for(int i = top;i>=0;i--){
            if(data[i] == target) {
                return (top - i + 1);
            }
        }
        // 返回-1代表没有
        return -1;
    }

掌握一个知识点的时候只要自己能重新实现一遍或者能讲给别人,即使有段时间没有进行使用,下次碰到的时候也会很快记忆,并且迅速能有思路的。反复几次,加深印象。

🎈练习题

源代码:https://gitee.com/ihaner/leetcode/tree/master/src/problem/leet155

源代码:https://gitee.com/ihaner/leetcode/tree/master/src/SwordFingerOffer/offer09

源代码:https://gitee.com/ihaner/leetcode/tree/master/src/problem/face0302

  • 45
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

友人和他的朋友们

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值