Java 实现栈的三种方式

下面是详细讲解“Java 实现栈的三种方式”的完整攻略。

1. 栈的概述

栈(Stack)是一种常见的操作系统模型,具有“先进后出”(Last In First Out)的特点。栈被广泛应用于函数调用、表达式求值、程序递归等领域,是算法和数据结构中必不可少的基本数据结构之一。

栈的基本操作包含了入栈(push)、出栈(pop)、获取栈顶元素(peek)等。实现栈的方式有很多,下面将介绍Java实现栈的三种方式。

2. 数组实现栈

数组实现栈的方式非常简单,只需要定义一个数组和一个指向栈顶的指针,然后对数组进行增删操作即可。具体实现请看下面的代码示例:

public class ArrayStack {
    private int[] data;
    private int top;
    private int size;

    public ArrayStack(int capacity) {
        this.data = new int[capacity];
        this.top = -1;
        this.size = capacity;
    }

    public void push(int value) {
        if (top == size - 1) {
            throw new RuntimeException("Stack is full!");
        }
        data[++top] = value;
    }

    public int pop() {
        if (top == -1) {
            throw new RuntimeException("Stack is empty!");
        }
        return data[top--];
    }

    public int peek() {
        if (top == -1) {
            throw new RuntimeException("Stack is empty!");
        }
        return data[top];
    }

    public boolean isEmpty() {
        return top == -1;
    }

    public boolean isFull() {
        return top == size - 1;
    }
}

上面的代码定义了一个ArrayStack类,包含了入栈(push)、出栈(pop)、获取栈顶元素(peek)、判断栈是否为空(isEmpty)、判断栈是否已满(isFull)等方法。可以通过下面的代码进行测试:

public static void main(String[] args) {
    ArrayStack stack = new ArrayStack(5);
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);
    stack.push(5);
    System.out.println("peek:" + stack.peek());
    while (!stack.isEmpty()) {
        System.out.print(stack.pop() + " ");
    }
}

输出结果为:

peek:5
5 4 3 2 1 

3. 链表实现栈

链表实现栈是一种常见的实现方式,它和数组实现有一定区别,它不需要事先指定大小,并且可以动态调整大小。具体实现请看下面的代码示例:

public class LinkedStack {
    class Node {
        int val;
        Node next;

        public Node(int val) {
            this.val = val;
        }
    }

    private Node top;
    private int size;

    public LinkedStack() {
        top = null;
        size = 0;
    }

    public void push(int value) {
        Node newNode = new Node(value);
        newNode.next = top;
        top = newNode;
        size++;
    }

    public int pop() {
        if (top == null) {
            throw new RuntimeException("Stack is empty!");
        }
        int res = top.val;
        top = top.next;
        size--;
        return res;
    }

    public int peek() {
        if (top == null) {
            throw new RuntimeException("Stack is empty!");
        }
        return top.val;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public int size() {
        return size;
    }
}

上面的代码定义了一个LinkedStack类,包含了入栈(push)、出栈(pop)、获取栈顶元素(peek)、判断栈是否为空(isEmpty)、获取栈大小(size)等方法。可以通过下面的代码进行测试:

public static void main(String[] args) {
    LinkedStack stack = new LinkedStack();
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);
    stack.push(5);
    System.out.println("peek:" + stack.peek());
    while (!stack.isEmpty()) {
        System.out.print(stack.pop() + " ");
    }
}

输出结果为:

peek:5
5 4 3 2 1 

4. Java自带Stack类

Java中已经封装好了栈的实现类——Stack,它继承自Vector类,相对于普通的Vector,Stack添加了关于操作栈的方法和特性。具体用法请看下面的代码示例:

public static void main(String[] args) {
    Stack<Integer> stack = new Stack<>();
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);
    stack.push(5);
    System.out.println("peek:" + stack.peek());
    while (!stack.isEmpty()) {
        System.out.print(stack.pop() + " ");
    }
}

输出结果为:

peek:5
5 4 3 2 1 

5. 总结

以上就是Java实现栈的三种方式,它们各有优缺点,可以针对不同的需求进行选择。数组实现栈对内存占用比较少,但大小固定;链表实现栈对动态调整大小非常方便,但对内存占用比较大;Java自带Stack类使用简单方便,但相对于手动实现要慢一些,而且它是线程安全的。在实际工作中,需要根据实际情况进行选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 实现栈的三种方式 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 详解Springboot分布式限流实践

    详解 Spring Boot 分布式限流实践 简介 随着互联网的快速发展,面对海量的请求,如何保证系统的稳定性和可用性就成为了分布式系统中必须解决的问题之一。限流是一种应对高并发场景的有效手段,只有控制请求流量,才能避免系统的崩溃或服务的瘫痪。本篇文章将详细讲解如何在 Spring Boot 中实现分布式限流。 限流方式 常见的限流方式包括漏桶算法、令牌桶算…

    Java 2023年5月19日
    00
  • Java实战之校园外卖点餐系统的实现

    Java实战之校园外卖点餐系统的实现攻略 本次攻略将介绍如何用Java实现一个校园外卖点餐系统。本系统涵盖了用户注册登录、商家上传餐品、用户下单、商家接单等功能。 思路分析 用户注册登录:用户需要填写基本信息,通过验证后才能注册成功。注册成功后,用户可以用自己的账号密码进行登录。 商家上传餐品:商家需要填写餐品名称、价格、描述和图片等信息,上传后用户可以浏览…

    Java 2023年5月24日
    00
  • SpringBoot2.7 WebSecurityConfigurerAdapter类过期配置

    下面就为您详细讲解SpringBoot 2.7版本中WebSecurityConfigurerAdapter类过期配置的完整攻略。 1. WebSecurityConfigurerAdapter类过期原因 在SpringBoot2.7版本中,WebSecurityConfigurerAdapter类的configure(HttpSecurity http)方…

    Java 2023年6月3日
    00
  • Mybatis下的SQL注入漏洞原理及防护方法解析

    Mybatis是一个流行的Java持久层框架,它具有方便的ORM(对象关系映射)实现方式和优秀的性能。然而,一些开发人员对Mybatis的SQL注入漏洞缺乏足够的认识,导致了许多Mybatis系统的漏洞。 SQL注入漏洞原理 所谓SQL注入,是指攻击者在Web应用中注入恶意的SQL语句,从而执行一些数据篡改、信息泄露等恶意操作。Mybatis中的SQL注入漏…

    Java 2023年5月20日
    00
  • 在Action中以Struts2的方式输出JSON数据的实例

    下面是“在Action中以Struts2的方式输出JSON数据的实例”完整攻略,过程中包含两条示例: 1. 添加Struts2-json-plugin插件 在使用Struts2输出JSON格式数据之前,我们需要先添加Struts2-json-plugin插件,该插件可以将Java对象转换为JSON格式数据并输出到浏览器。在pom.xml文件中添加以下代码即可…

    Java 2023年5月20日
    00
  • Springboot异常日志输出方式

    当Spring Boot应用程序出现异常时,我们需要能够及时发现并定位问题,根据异常信息进行问题解决。下面是Spring Boot异常日志输出方式的完整攻略: 1. 添加日志依赖 在Spring Boot 2.x版本中,Spring Boot默认集成了slf4j作为日志框架。可以通过在pom.xml文件中添加spring-boot-starter-loggi…

    Java 2023年5月26日
    00
  • Java中ArrayList同步的2种方法分享

    我很乐意为您提供“Java中ArrayList同步的2种方法分享”的攻略。 Java中ArrayList同步的2种方法分享 在Java中,ArrayList是一个非常常用的集合类,但是它不是线程安全的。为了保证多线程访问时的安全性,需要对ArrayList进行同步,接下来我们将分享两种方式可以使ArrayList变得线程安全。 方法一:使用Collectio…

    Java 2023年5月26日
    00
  • java如何导出insert语句并生成sql脚本

    要导出insert语句并生成sql脚本,我们可以使用Java中的JDBC(Java Database Connectivity)连接数据库并操作数据库。下面是详细的步骤: 加载数据库驱动。 首先需要加载对应的数据库驱动,这里以MySQL数据库为例,使用JDBC驱动名为com.mysql.jdbc.Driver。 Class.forName("com…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部