Stack详解(Java实现方式)

Stack-概述

栈(Stack)是计算机科学中一种经典的数据结构,它遵循后进先出(Last In, First Out, LIFO)的原则。

这意味着最后进入栈的元素最先被移除。

在这里插入图片描述

栈通常支持两种基本操作:压入(push)和弹出(pop)。

栈的基本操作:

  1. 压入(Push):将一个元素添加到栈的顶部。如果栈为空,则该元素成为栈的底部元素。

  2. 弹出(Pop):从栈的顶部移除一个元素,并返回该元素的值。如果栈为空,则弹出操作会导致栈为空。

在这里插入图片描述

栈的特性:

  • 后进先出(LIFO):最后压入栈的元素最先被弹出,类比于将物体堆放在一起,后放入的物体必须先取出才能获取到。

  • 顶部访问(Top):栈允许对顶部元素进行访问或操作,而不影响其它元素。

在这里插入图片描述


JAVA实现栈

1. ArrayDeque

  • ArrayDeque 是一个双端队列(deque)的实现,它可以在队列的两端进行元素的插入和删除操作。

  • 由于栈是一种只能在一端进行插入和删除的数据结构,因此可以使用 ArrayDeque 的一端来模拟栈的行为。

具体实现方式如下:

  1. 使用 ArrayDeque 创建一个空的双端队列对象:ArrayDeque<String> stack = new ArrayDeque<>();
  2. 使用 push() 方法将元素压入队列的一端,即栈顶部的位置:stack.push("Java");
  3. 使用 pop() 方法从队列的一端移除并返回栈顶部的元素:String topElement = stack.pop();
  4. 使用 peek() 方法返回但不移除栈顶部的元素:String topElement = stack.peek();
  5. 使用 isEmpty() 方法检查队列是否为空:boolean isEmpty = stack.isEmpty();

在 ArrayDeque 中,元素的插入和删除操作都是在同一端进行的,这样就满足了栈的后进先出(LIFO)的特性。

import java.util.ArrayDeque;

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

        // 压入元素
        stack.push("Java");
        stack.push("Python");
        stack.push("C++");

        // 弹出并打印元素
        while (!stack.isEmpty()) {
            System.out.println(stack.pop());
        }
    }
}

2. LinkedList

  • LinkedList 是 Java 集合框架中的一种双向链表实现, 也可以被用作栈的实现方式,其原理与 ArrayDeque 类似,只需要在链表的头部进行元素的插入和删除操作即可。
  1. 使用 LinkedList 创建一个空链表对象:LinkedList<String> stack = new LinkedList<>();
  2. 使用 push() 方法将元素插入链表的头部,即栈顶部的位置:stack.push("Java");
  3. 使用 pop() 方法从链表的头部移除并返回栈顶部的元素:String topElement = stack.pop();
  4. 使用 peek() 方法返回但不移除栈顶部的元素:String topElement = stack.peek();
  5. 使用 isEmpty() 方法检查链表是否为空:boolean isEmpty = stack.isEmpty();
  • 在 LinkedList 中,元素的插入和删除操作都是在链表的头部进行的,这样就满足了栈的后进先出(LIFO)的特性。

    import java.util.LinkedList;
    
    public class Main {
        public static void main(String[] args) {
            LinkedList<String> stack = new LinkedList<>();
    
            // 压入元素
            stack.push("Java");
            stack.push("Python");
            stack.push("C++");
    
            // 弹出并打印元素
            while (!stack.isEmpty()) {
                System.out.println(stack.pop());
            }
        }
    }
    

3. 数组实现

  • 数组也可以用来实现栈,使用一个数组来存储栈元素,同时记录一个指向栈顶的指针。

  • 在入栈和出栈操作时,更新指针位置即可。

    public class Stack {
        int[] data;
        int top;
    
        public Stack(int size) {
            data = new int[size];
            top = -1;
        }
    
        public void push(int value) {
            if (top == data.length - 1) {
                System.out.println("Stack is full");
                return;
            }
            data[++top] = value;
        }
    
        public int pop() {
            if (top < 0) {
                System.out.println("Stack is empty");
                return -1;
            }
            return data[top--];
        }
    
        public boolean isEmpty() {
            return top < 0;
        }
    
        public static void main(String[] args) {
            Stack stack = new Stack(3);
    
            // 压入元素
            stack.push(1);
            stack.push(2);
            stack.push(3);
    
            // 弹出并打印元素
            while (!stack.isEmpty()) {
                System.out.println(stack.pop());
            }
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喻师傅

谢谢您!我会继续努力创作!

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

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

打赏作者

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

抵扣说明:

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

余额充值