快速掌握“栈的底层实现及链式栈“

1. 栈(Stack)

1.1 什么是栈

【图示】
栈的图示
【概念】

  1. 栈是一种先进后出的数据结构,底层由数组和一个计数器组成(同顺序表)
  2. 栈,逻辑上先进后出,物理上连续
  3. usedSize计数器指向的下标就是栈顶,0下标是栈底

1.2 栈的使用

【方法说明】

  1. Stack(),构造一个空的栈
  2. E push(E e),将e入栈,并返回e
  3. E pop(),将栈顶元素出栈
  4. E peek(),获取栈顶元素,不出栈
  5. int size(),获取栈中有效元素个数
  6. boolean empty(),检测栈是否为空

【代码演示】

public class Test {  
    //演示Java中Stack的使用  
    public static void main(String[] args) {  
        Stack<Integer> stack = new Stack<>();  
        stack.push(12);  
        stack.push(23);  
        stack.push(34);  
        System.out.println(stack.peek());  
    }  
}

1.3 实现栈的CRUD

【前期准备】

  1. 准备数组和变量(计数器)
  2. 准备构造方法方便对数组进行初始化

【代码实现】

public class MyStack implements IStack {  
  
    public int elem[];  
    public int usedSize;  
  
    private static final int size = 8;
    
    //构造方法一
    public MyStack(int usedSize) {  
        //使代码调用者可以自定义数组内存大小  
        this.elem = new int[usedSize];  
    } 
    //构造方法二
    public MyStack() {  
        this.elem = new int[size];  
    }
}
a. 增(2道)

【需注意】

  1. 栈是否为满,满了不再能入栈

1. 构造一个空的栈(构造方法)
【代码逻辑】

  1. 找思路:自定义数组大小
  2. 写代码框架:无
  3. 填充代码:无
  4. 完善代码逻辑严谨性:无

【代码实现】

//构造方法一
public MyStack(int usedSize) {  
    //使代码调用者可以自定义数组内存大小  
    this.elem = new int[usedSize];  
} 
//构造方法二
public MyStack() {  
    this.elem = new int[size];  
}

2. 将e入栈,并返回e
【代码逻辑】

  1. 找思路:入栈的下标正好是usedSize指向的下标
  2. 写代码框架:无
  3. 填充代码:无
  4. 完善代码逻辑严谨性:判断栈是否满了,满了要扩容

【代码实现】

//该方法判断栈是否满了
private boolean isFull() {  
    return this.elem.length == this.usedSize;  
}

public void push(int e) {  
    if (isFull()) {  
        //满了就扩容  
        this.elem = Arrays.copyOf(this.elem,2*this.elem.length);  
    }  
    this.elem[this.usedSize] = e;  
    usedSize++;  
}
b. 删(1道)

【需注意】

  1. 栈是否为空,空了不再能出栈

1. 将栈顶元素出栈
【代码逻辑】
2. 找思路:必须用第三个变量存数据
3. 写代码框架:无
4. 填充代码:无
5. 完善代码逻辑严谨性:判断栈是否为空

【代码实现】

public int pop() {  
    if (empty()) {  
        return -1;  
    }  
    //用ret把usedSize存起来  
    int ret = this.usedSize-1;  
    //us--  
    this.usedSize--;  
    //返回ret下标的值  
    return this.elem[ret];  
  
}
c. 查(3道)

1. 获取栈顶元素,不出栈
【代码逻辑】

  1. 找思路:无
  2. 写代码框架:无
  3. 填充代码:无
  4. 完善代码逻辑严谨性:判断栈是否为空

【代码实现】

public int peek() {  
    if (empty()) {  
        return -1;  
    }  
    return this.elem[this.usedSize-1];  
}

2. 获取栈中有效元素个数
【代码逻辑】

  1. 找思路:无
  2. 写代码框架:无
  3. 填充代码:无
  4. 完善代码逻辑严谨性:无

【代码实现】

public int size() {  
    return this.usedSize;  
}

3. 检测栈是否为空
【代码逻辑】

  1. 找思路:无
  2. 写代码框架:无
  3. 填充代码:无
  4. 完善代码逻辑严谨性:无

【代码实现】

public boolean empty() {  
    //为空返回true  
    return this.usedSize == 0;  
}

2. 链式栈

【图示】
在这里插入图片描述

【代码演示】链式栈是一种底层由链表实现的栈,也就是说链表本身可以直接拿来当栈使用

LinkedList<Integer> linkedList = new LinkedList();  
//入栈  
linkedList.addFirst(12);  
linkedList.addFirst(23);  
//出栈  
System.out.println(linkedList.pop());  //23

3. 栈,虚拟机栈和栈帧

  1. 栈:是一种先进后出的数据结构,底层由数组组成
  2. 虚拟机栈:是JVM划分的一块内存
  3. 栈帧:调用方法时,会在JVM中给这个方法开辟一块内存空间,这块内存就是栈帧
  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值