Java实现栈(链表和线性表两种方法实现)

简介:

Java实现栈(链表和线性表两种方法实现)

一、栈的介绍
任何数据结构都是一种规则

栈就是在最基础的结构——线性结构和链式结构上面定义规则形成的

如果对基本数据结构(线性表和链表)有疑问的同学可以看我之前的博客:https://www.cnblogs.com/yxm2020/p/12762888.html

规则如下:

限制链表或者线性表元素的插入和取出,只能在同一端进行操作,运行插入的一段称为栈顶(top),另一端为固定的一端,成为栈底。

图解:(入栈和出栈)

特点:

先入后出FILO(First in last out),最先放入栈的数据,只能最后才能出来,和队列完全相反

栈的应用场景:

保存运行过程中程序中的代码或者值,比如:

子程序的调用
处理递归的调用
表达式的转换(中缀转后缀)
二叉树的遍历
图形的深度优先遍历
二、代码的实现思路
1、思路

确定一个结构存储数据,线性表或者链表
既然只能在栈顶操作,那么定义一栈顶标志(top)
最基本的两个方法,入栈和出栈
入栈后,在栈顶加入一个元素,top上移一个单元
出栈后,在栈顶删除一个元素,top下移一个单元
2、Java实现

用Java数组模拟栈
java链表实现栈
三、Java数组模拟栈
public class ArrayStack {

//栈顶标志
private int top;
//java数组
private T[] stack;
//最大长度
private int maxsize;
public ArrayStack(int maxsize,Class<T> type){
    this.maxsize = maxsize;
    this.top = -1;
    stack = (T[]) Array.newInstance(type,maxsize);
}
//长度
public int size(){
    return top+1;
}
//栈满
public boolean isFull(){
    return top == maxsize-1;
}
//栈空
public boolean isEnpty(){
    return top == -1;
}
//入栈
public void push(T t){
    if(isFull()){
        throw new RuntimeException("栈满");
    }
    top++;
    stack[top] = t;
}
//出栈
public T pop(){
    if(isEnpty()){
        throw new RuntimeException("栈空");
    }
    T value = stack[top];
    top--;
    return value;
}
//遍历
public void show(){
    if(isEnpty()){
        System.out.println("栈空");
    }
    int temp = top;
    while (temp != -1){
        System.out.println(stack[temp]);
        temp--;
    }
}

}
四、Java链表实现栈
public class LinkedStack {

//定义一个栈顶标志,带了个
private Node top;
private class Node{
    private Node next;
    private T t;
    public Node(T t){
        this.t = t;
    }
}
//创建
public LinkedStack(){
    top = new Node(null);
}
//栈空
public boolean isEnpty(){
    if(top.next == null){
        return true;
    }
    return false;
}
//入栈
public void push(T t){
    Node newNode = new Node(t);
    //从栈顶入
    newNode.next = top.next;
    top.next = newNode;
}
//出栈
public T pop(){
    if(isEnpty()){
        System.out.println("栈空");
        return null;
    }
    T value = top.next.t;
    top.next = top.next.next;
    return value;
}
//show
public void show(){
    Node temp = top;
    if(temp.next == null){
        System.out.println("栈空");
    }
    while (temp.next!=null){
        temp = temp.next;
        System.out.println(temp.t);
    }
}

}

原文地址https://www.cnblogs.com/yxm2020/p/12859000.html

相关文章
|
3月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
335 18
|
3月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
245 4
|
4月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
186 11
|
3月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
338 5
|
4月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
5月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
507 0
|
5月前
|
存储 Java 数据处理
Java映射操作:深入Map.getOrDefault与MapUtils方法
结合 `getOrDefault`方法的简洁性及 `MapUtils`的丰富功能,Java的映射操作变得既灵活又高效。合理地使用这些工具能够显著提高数据处理的速度和质量。开发人员可以根据具体的应用场景选择适宜的方法,以求在性能和可读性之间找到最佳平衡。
238 0
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
174 2