栈的Java实现--链栈
链栈,顾名思义,就是以链表的形式实现的栈的相关操作,其实是功能弱化了的链表,如果已经阅读过链表的实现代码,那么链栈的实现显得更为容易。
链栈的基本结构:
链栈的入栈操作:
- 让top引用指向新的节点,新节点的next指向原来的top
- 记录栈内元素个数的size+1
链栈的出栈操作:
- top引用指向原栈顶元素的下一个元素(top.next),并释放原栈顶元素的引用
- 记录栈内元素个数的size-1
链栈的Java实现代码:
package com.liuhao.DataStructures; public class LinkStack<T> { private class Node { private T data;// 保存节点的数据元素 private Node next;// 保存下一个节点的引用 public Node() { } public Node(T data, Node next) { this.data = data; this.next = next; } } private Node top;// 存放栈顶节点 private int size = 0;// 存放栈中已有的元素个数 // 创建空链栈 public LinkStack() { top = null; } // 已指定数据元素创建链栈,只有一个元素 public LinkStack(T element) { top = new Node(element, null); size++; } // 返回链栈的长度 public int length() { return size; } // 进栈 public void push(T elemnt) { // 让top指向新节点,新节点的next指向原来的top top = new Node(elemnt, top); size++; } // 出栈 public T pop() { // 若当前为空栈,则返回null if (size == 0) { return null; } Node oldTop = top; // 让top指向原栈顶的下一个节点 top = top.next; // 释放原栈顶元素的引用 oldTop.next = null; size--; return oldTop.data; } // 获取栈顶元素 public T getTop() { // 若当前为空栈,则返回null if (size == 0) { return null; } return top.data; } // 判断是否为空 public boolean isEmpty() { return size == 0; } // 清空栈 public void clear() { top = null; size = 0; } public String toString() { if (size == 0) { return "[]"; } else { StringBuilder sb = new StringBuilder("["); for (Node current = top; current != null; current = current.next) { sb.append(current.data.toString() + ", "); } sb.append("]"); int length = sb.length(); return sb.delete(length - 3, length - 1).toString(); } } }
测试代码:
package com.liuhao.test; import org.junit.Test; import com.liuhao.DataStructures.LinkStack; public class LinkStackTest { @Test public void test() { // 以指定第一个元素和底层数组长度的方式构建顺序栈 LinkStack<String> linkStack = new LinkStack<String>("我"); System.out.println("当前所含内容" + linkStack); // 压入数据元素,元素格式大于了定义栈时底层数组的长度 linkStack.push("是"); linkStack.push("liuhao"); linkStack.push("程序员"); // 发现是先入后出的方式打印的 System.out.println("当前所含内容" + linkStack); // 获取栈中元素个数 System.out.println("当前栈中元素个数是:" + linkStack.length()); // 获取栈顶元素 System.out.println("当前栈顶元素是:" + linkStack.getTop()); // 弹出元素 System.out.println("弹出元素:" + linkStack.pop()); // 发现是先入后出的方式打印的 System.out.println("当前所含内容" + linkStack); // 获取栈顶元素 System.out.println("当前栈顶元素是:" + linkStack.getTop()); // 获取栈中元素个数 System.out.println("当前栈中元素个数是:" + linkStack.length()); // 判断是否为空栈 System.out.println("当前栈是否为空:" + linkStack.isEmpty()); // 清空栈 linkStack.clear(); // 判断是否为空栈 System.out.println("当前栈是否为空:" + linkStack.isEmpty()); // 获取栈顶元素,空栈时返回null System.out.println("当前栈顶元素是:" + linkStack.getTop()); // 获取栈中元素个数 System.out.println("当前栈中元素个数是:" + linkStack.length()); // 空栈时进行弹出元素 System.out.println("弹出元素:" + linkStack.pop()); } }
测试结果:
JDK提供的栈:
对于Java集合而言,并没有提供一个Stack接口,再为该接口提供顺序栈、链栈两种实现。
实际上提供了一下两种实现方式:
- java.util.Stack:一个普通的顺序栈,底层基于数组实现,同时是线程安全的,可以在多线程环境下放心使用。
- java.util.LinkedList:之前介绍过,LinkedList是一个双向链表,但是查看该类的API可以发现,它同时也提供了push()、pop()、peek()等方法,这表明LinkedList完全可以当成栈来使用。但是要注意LinkedList不是线程安全的。
代码获取地址:https://github.com/liuhao123/JavaMore.git
相关推荐
在这个Java算法实例中,"SepStack1501203023"和"LinkStack1501203023"可能代表两个类,分别实现了顺序栈和链栈的抽象数据类型(ADT)。这些类可能包含了如下功能: - `push(E element)`:向栈顶添加一个元素。 - `...
在这个主题中,我们将深入探讨如何在Java中实现栈这一基本数据结构,具体包括顺序栈(stack_SqStack)和链栈(stack_SLinkList)。 栈是一种后进先出(Last In First Out, LIFO)的数据结构,常用于临时存储和快速...
在Java中,我们可以使用单链表来实现链式栈。下面将详细介绍链式栈的原理、实现以及相关操作。 **链式栈的基本概念** 栈是一种特殊的线性数据结构,遵循“后进先出”(Last In First Out, LIFO)原则。链式栈是用...
在本节中,我们将通过Java语言实现链栈的基本操作,包括入栈、出栈、查看栈顶元素、获取栈的长度、判断栈是否为空等。 首先,我们定义了一个Node类,该类用于表示链栈中的每个结点。每个结点包括两个成员变量:数据...
以上是链栈在C、C++和Java中的基本实现。通过链栈,我们可以有效地执行后进先出(LIFO)操作,如表达式求值、括号匹配等。理解链栈的工作原理和实现对于学习数据结构和算法至关重要,特别是在理解和优化计算机程序的...
链栈的实现通常使用C++、Java等面向对象语言,下面以C++为例,展示链栈的基本结构和操作函数实现: ```cpp #include struct Node { int data; Node* next; }; class LinkStack { private: Node* top; public:...
本实验报告主要涵盖了使用Java实现顺序栈和链栈,并通过实际应用加深对栈的理解。 1. **顺序栈**: - **存储结构**:顺序栈通常用数组来实现,其元素在内存中是连续存储的。在Java中,我们可以创建一个泛型类`...
java 实现链栈存储的方法 链栈存储是计算机科学中的一种基本数据结构,它可以存储和管理数据。java 是一种流行的编程语言,下面我们将讲解如何使用 java 实现链栈存储的方法。 链栈是一种特殊的数据结构,它可以...
以下是Java栈之链式栈存储结构的实现代码的相关知识点: 一、链栈的定义 链栈是一种使用链表来存储元素的栈结构。在链栈中,每个元素都是一个独立的对象,节点中保存着数据和指向下一个节点的引用。链栈的实现可以...
实验中使用了单链表实现链栈,类名为`SequeueStack`,同样包含`push`、`pop`和`list`方法。链栈相比顺序栈,插入和删除操作更灵活,因为无需考虑数组的大小限制。 4. **括号匹配**: 括号匹配问题使用栈来解决,是...
在实现这个算法时,我们可以选择使用各种编程语言,例如C++、Java、Python等。代码应确保处理所有可能的输入情况,包括无效表达式、括号不匹配等错误,以确保代码的安全性和可靠性。同时,为了提高效率,我们通常会...
在Java编程中,线性表有多种实现方式,包括顺序表、栈、队列以及链表等。下面我们将详细探讨这些结构的特性、实现原理以及在Java中的具体应用。 1. **顺序表**: - **概念**:顺序表是一种存储结构,其中元素在...
在这个Java版的压缩包中,包含了多种常用数据结构的实现,包括链栈、顺序表、顺序栈、顺序查找、链表、二叉树的遍历、顺序队、链队、线索二叉树以及创建二叉树。下面将逐一详细介绍这些知识点。 1. **链栈**:链栈...
栈的实现通常有两种:顺序栈(Array-based Stack)和链栈(Linked Stack)。顺序栈利用数组的连续存储特性,栈顶指针指向栈顶元素;链栈则使用链表,节点包含元素和指向下一个节点的指针,头部为队首,尾部为队尾。...
栈可以通过多种方式实现,其中最常见的是使用数组(顺序栈)和链表(链栈)。 - **顺序栈**: 使用数组来存储栈中的元素。数组的最后一个索引通常被用作栈顶位置。当栈满时,可以扩大数组的大小以容纳更多元素。 `...
在Java中,ArrayStack或ArrayList可以实现顺序栈,而LinkedList可以实现链栈。顺序栈的插入和删除操作都在一端进行,效率受制于数组大小;链栈则通过修改节点的链接关系,操作更为灵活。 在计算器的实现中,可能会...
同时,掌握如何将这些数据结构应用于编程实践,如使用C++或Java的容器类库实现栈和队列,将有助于提升你的编程能力和解决问题的能力。此外,理解这些数据结构的内部工作原理和时间复杂性也是备考的重要部分。通过...
实验82是一个关于计算后缀表达式值的实践任务,主要涉及计算机科学中的算法和数据结构,特别是使用Java编程语言实现。后缀表达式,也称为逆波兰表示法,是一种在数学和计算机科学中用于表示算术表达式的方法。在这个...
顺序队列同样基于数组实现,但在实现上比栈复杂。为了处理队头元素的删除,需要在队满时进行数组元素的移位,这称为“假溢出”。当队列为空时,需要检查是否真的为空,以避免访问无效位置。 **6. 链式队列(Linked ...