栈的Java实现--链栈

栈的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

  • 大小: 5.7 KB
  • 大小: 14.6 KB
  • 大小: 13.7 KB
  • 大小: 6.5 KB
  • 查看图片附件

栈的Java实现--链栈,布布扣,bubuko.com

时间: 2024-10-14 11:15:26

栈的Java实现--链栈的相关文章

java实现链栈

前面学习了java实现顺序栈:http://www.cnblogs.com/lixiaolun/p/4644134.html 接下来,学习java实现链栈. 链栈类代码: package linkedstack; public class LinkStack { private Element base; private Element top; class Element { public Object data; public Element next; } /** * 初始化栈 * */

java使用链栈实现数制转换

java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html 将前面java实现链栈的代码稍作修改: package linkedstack; public class LinkStack { private Element base; private Element top; class Element { public Object data; public Element next; } /** * 初始化栈 * */ pu

java 实现链栈存储

package com.learn.algorithm.linkStack; /** * 链栈实现 * @author Jiekun.Cui * @param <T> */ public class LinkStack<T> { private LinkStack<T>.Node<T> top = new Node<T>(); private int size=0; /** * 进栈 * @param t * @return ; */ publi

栈的java实现和栈的应用举例

转自:http://coolxing.iteye.com/blog/1468674 —————————————————————————————————————————————————————————— [例子和习题出自数据结构(严蔚敏版), 本人使用java进行实现.  转载请注明作者和出处,  如有谬误, 欢迎在评论中指正. ] 栈的实现 栈是一种先进后出的数据结构, 首先定义了栈需要实现的接口: Java代码   public interface MyStack<T> { /** * 判断

数据结构(C实现)------- 链栈

描述:      链栈,即栈的链式存储结构,链栈通常使用不带头结点的单链表来表示,因此其结点的结构和单链表的结点结构相同. 在一个链栈中,栈底就是链表的最后一个结点,而栈顶总是链表的第一个结点.因此,新入栈的元素即为链表中采用头插法新加入的结点,一个链栈可以由栈顶指针唯一确定,当top为NULL时,则表示该栈是一个空的链栈.  实现:   链栈结点的类型描述: typedef int ElemType; typedef struct node{ ElemType data; struct nod

数据结构与算法——链栈

今天总结链栈. 什么是链栈? 链栈就是栈的链式存储结构,就跟单链表差不多.只不过头指针变成了栈顶指针,这个指针总是指向栈顶元素.栈底结点的指针域指向NULL,当top==NULL时,则栈为空.具体实现时,对比着单链表,然后结合图示,很容易就写出来了. 图示: 实现: <span style="font-family:Courier New;font-size:14px;">#include <iostream> using namespace std; temp

数据结构 - 链栈的实行(C语言)

数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢,所以比较好的办法是把栈顶放在单链表的头部(如下图所示).另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的. 对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 top=NULL 的时候. 链栈的结构代码如下: /* 链栈

Java数据结构-线性表之栈(顺序栈和链栈)

栈的定义:(特殊的线性表) ??仅在表的一端进行插入和删除的线性表.允许插入.删除的这一端称为栈顶,另一端称为栈底.表中没有元素时称为空栈. ??被称为后进先出的线性表(Last In First Out),简称 LIFO表,或被称为先进后出的线性表(First In Last Out),简称 FILO表. ??栈更具存储方式的不同分为两种:顺序栈和链栈. 顺序栈: 和顺序表一样,顺序栈也采用数组来存放数据元素: 为了保证栈底位置的不变,采用数组下标为0的位置作为顺序栈的栈底. 而栈顶指针的最大

数据结构(java语言描述)链栈的定义

1.定义栈接口 package stack;public interface Istack {    public void clear();    public boolean isEmpty();    public int length();    public Object peek();    public void push(Object x) throws Exception;    public Object pop();} 2.定义Node结点 package stack; i