Java 实现栈的三种方式

yizhihongxing

下面是详细讲解“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日

相关文章

  • Apache ActiveMQ任意文件写入漏洞(CVE-2016-3088)复现

    以下是Apache ActiveMQ任意文件写入漏洞(CVE-2016-3088)的完整攻略: 漏洞介绍 Apache ActiveMQ是一款开源的消息队列系统。当使用ActiveMQ的fileserver和http服务时,可以利用该漏洞将任意文件写入至任意路径,从而造成远程代码执行。 漏洞编号:CVE-2016-3088漏洞评级:高危 环境搭建 首先需要搭…

    Java 2023年6月15日
    00
  • java 读写 ini 配置文件的示例代码

    要读写ini配置文件,我们可以使用Java的Properties类。Properties类提供了一种简单的机制来将“key-value”对存储到配置文件中,并从中检索。 以下是读取配置文件的示例代码: import java.io.FileInputStream; import java.util.Properties; public class ReadI…

    Java 2023年5月19日
    00
  • java.net.MalformedURLException异常的解决方法

    当使用Java中的URL类时,如果传递给构造函数的URL格式不正确,则会抛出java.net.MalformedURLException异常。下面是针对该异常的解决方法: 1. 检查URL格式是否正确 首先检查传递给URL构造函数的字符串是否符合URL格式。以下是一个有效的URL示例: https://www.example.com 正确的URL应该包括UR…

    Java 2023年5月27日
    00
  • SpringBoot项目鉴权的4种方式小结

    下面我们来详细讲解SpringBoot项目鉴权的4种方式,包括:JWT鉴权、Session鉴权、OAuth2鉴权以及SaaS鉴权。 1. JWT鉴权 JWT鉴权是目前最常用的鉴权方式之一,其具有轻量级、无状态、较高的安全性等特点。这里简单介绍一下JWT鉴权的原理: 在用户登录成功之后,服务器会将用户信息通过一定的加密方式生成一份Token,并将其返回给客户端…

    Java 2023年6月3日
    00
  • Spring Data JDBC介绍及实现代码

    Spring Data JDBC 是 Spring Framework 的一个子项目,它通过简化数据持久化操作来降低开发人员的工作量。Spring Data JDBC 不同于其他的 ORM 框架,它并不需要实体类与表间的映射,而是基于传统的 JDBC 封装来进行操作,并且支持 SQL 和存储过程的调用。 Spring Data JDBC 的使用包含以下几个步…

    Java 2023年5月20日
    00
  • JAVA/JSP学习系列之六(MySQL翻页例子)

    JAVA/JSP学习系列之六(MySQL翻页例子) 本文将介绍如何使用JAVA和JSP实现MySQL翻页效果,以充分利用数据库的性能,同时提高用户体验。 1. 分页原理 分页语句的基本语法如下: SELECT * FROM table LIMIT start, size 其中,start表示起始位置,size表示获取的数据数量。我们可以通过计算来动态生成LI…

    Java 2023年6月15日
    00
  • 详解SpringBoot和Mybatis配置多数据源

    下面详细讲解一下关于“详解SpringBoot和Mybatis配置多数据源”的完整攻略。 一、为什么需要配置多数据源? 在实际的项目中,我们很有可能需要同时访问多个数据库,而这些数据库可能是不同类型的,比如 MySQL 和 Redis,因此需要在 Spring Boot 和 Mybatis 的框架基础上实现多数据源配置。 二、配置过程 首先,在 pom.xm…

    Java 2023年5月20日
    00
  • SpringMVC文件上传原理及实现过程解析

    SpringMVC文件上传原理解析 在SpringMVC文件上传时,客户端向服务器发送文件,SpringMVC通过MultipartResolver对请求进行处理,解析出其中的文件,并将文件保存到指定的位置。MultipartResolver是一个接口,SpringMVC提供了两种实现方式: StandardServletMultipartResolver:…

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