package com.wzlove.stack;

import java.util.Iterator;
import java.util.NoSuchElementException; /**
* 链表实现栈结构:栈的结构是先进后出,所以栈的结点也包括了两个部分
* 1.构造函数初始化栈
* 2.判空操作
* 3.栈的长度操作
* 4.入栈
* 5.出栈
* 6.返回最近入栈的元素
* 7.格式化输出
*
* @author WZLOVE
* @create 2018-07-14 21:53
*/
public class LinkedStack<Item> implements Iterable<Item> {
/**
* 表示栈的长度
*/
private int n; /**
* 首节点
*/
private Node first; /**
* 结点的结构
*/
private class Node{
private Item item;
private Node next;
} /**
* 构造方法初始化栈
*/
public LinkedStack() {
first = null;
n = 0;
assert check();
} /**
* 判断栈是否为空
* @return boolean类型,空为true,不空为false
*/
public boolean isEmpty(){
return first == null;
} /**
* 返回栈的长度
* @return
*/
public int size(){
return n;
} /**
* 入栈方法
* @param item 入栈的元素
*/
public void push(Item item){
// 保存旧的栈
Node oldFirst = first;
// 创建结点
first = new Node();
// 保存新的结点
first.item = item;
first.next = oldFirst;
// 修改栈的长度
n++;
assert check();
} /**
* 出栈方法
* @return Item 出栈的元素
*/
public Item pop(){
if(isEmpty()){
throw new NoSuchElementException("栈为空,没有元素");
}
// 保存栈顶元素
Item item = first.item;
// 移动指针
first = first.next;
// 减小长度
n--;
assert check();
return item;
} /**
* 返回最近入栈的元素
* @return Item 入栈的元素
*/
public Item peek(){
if(isEmpty()){
throw new NoSuchElementException("栈为空,没有元素");
}
return first.item; } /**
* 格式化输出
* @return
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for(Item item : this){
sb.append(item + " ");
}
return sb.toString();
} @Override
public Iterator<Item> iterator() {
return new ListIterator();
} /**
* 迭代器类
* @return
*/
private class ListIterator implements Iterator<Item>{ /**
* 复制栈,进行遍历
*/
private Node current = first; /**
* 判断有无更多元素,有返回true,没有返回false
* @return
*/
@Override
public boolean hasNext() {
return current != null;
} /**
* 返回当前元素,移动指针
* @return
*/
@Override
public Item next() {
if(!hasNext()){
throw new NoSuchElementException("没有更多的元素");
}
Item item = current.item;
current = current.next;
return item;
} @Override
public void remove() {
throw new UnsupportedOperationException("不支持该操作");
}
} // check internal invariants
private boolean check() { // check a few properties of instance variable 'first'
if (n < 0) {
return false;
}
if (n == 0) {
if (first != null) return false;
}
else if (n == 1) {
if (first == null) return false;
if (first.next != null) return false;
}
else {
if (first == null) return false;
if (first.next == null) return false;
} // check internal consistency of instance variable n
int numberOfNodes = 0;
for (Node x = first; x != null && numberOfNodes <= n; x = x.next) {
numberOfNodes++;
}
if (numberOfNodes != n) return false; return true;
} /**
* 主方法进行测试
* @param args
*/
public static void main(String[] args) {
// 初始化栈
LinkedStack<String> linkedStack = new LinkedStack<>() ;
// 输出栈的长度
System.out.println("初始化后栈的长度:"+linkedStack.size());
System.out.println("=====================================");
// 入栈
linkedStack.push("迪丽热巴");
linkedStack.push("李溪芮");
linkedStack.push("杨紫");
linkedStack.push("杨幂");
// 迭代器遍历
Iterator<String> iterator = linkedStack.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("====================================");
// 出栈
System.out.println(linkedStack.pop());
System.out.println("====================================");
// 输出栈的长度
System.out.println("经过操作后的长度为:" + linkedStack.size());
}
}

Java之链表实现栈结构的更多相关文章

  1. 数据结构笔记--栈的总结及java数组实现简单栈结构

    杂谈"栈"结构: 栈(Stack)是一种插入删除操作都只能在一个位置上进表,这个位置位于表的末端,叫做栈顶(Top). 对栈的基本操作有push和pop,表示进栈和出栈.也就相当于 ...

  2. Java使用泛型实现栈结构

    泛型是Java SE5.0的重要特性,使用泛型编程可以使代码获得最大的重用.由于在使用泛型时要指明泛型的具体类型,这样就避免了类型转换.本实例将使用泛型来实现一个栈结构,并对其进行测试. 思路分析:既 ...

  3. Java用链表实现栈和队列

    1.用链表实现栈 package stack; /** * * @author denghb * */ class Link { public long dData; public Link next ...

  4. Java 用链表实现栈和队列

    栈 是一种基于后进先出(LIFO)策略的集合类型.当邮件在桌上放成一叠时,就能用栈来表示.新邮件会放在最上面,当你要看邮件时,会一封一封从上到下阅读.栈的顶部称为栈顶,所有操作都在栈顶完成. 前面提到 ...

  5. Java通过链表实现栈

    class LinkedStack<T> { private Node top; private int size; /** * 初始化栈 */ public LinkedStack() ...

  6. 线性表 及Java实现 顺序表、链表、栈、队列

    数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...

  7. 数据结构 1 线性表详解 链表、 栈 、 队列 结合JAVA 详解

    前言 其实在学习数据结构之前,我也是从来都没了解过这门课,但是随着工作的慢慢深入,之前学习的东西实在是不够用,并且太皮毛了.太浅,只是懂得一些浅层的,我知道这个东西怎么用,但是要优化.或者是解析,就不 ...

  8. 手写实现java栈结构,并实现简易的计算器(基于后缀算法)

    一.定义 栈是一种线性表结构,栈结构中有两端,对栈的操作都是对栈的一端进行操作的,那么被操作的一端称为栈顶,另一端则为栈底.对栈的操作其实就是只有两种,分别是入栈(也称为压栈)和出栈(也称为弹栈).入 ...

  9. java实现单链表、栈、队列三种数据结构

    一.单链表 1.在我们数据结构中,单链表非常重要.它里面的数据元素是以结点为单位,每个结点是由数据元素的数据和下一个结点的地址组成,在java集合框架里面 LinkedList.HashMap(数组加 ...

随机推荐

  1. Netty源码分析第5章(ByteBuf)---->第3节: 缓冲区分配器

    Netty源码分析第五章: ByteBuf 第三节: 缓冲区分配器 缓冲区分配器, 顾明思议就是分配缓冲区的工具, 在netty中, 缓冲区分配器的顶级抽象是接口ByteBufAllocator, 里 ...

  2. 学习笔记 | Github

    Github教程 \(Github\)是个好东西QwQ 存代码不用U盘爸爸妈妈再也不用担心我的U盘弄丢没有备份啦! 创建github账号 创建仓库 输入命令 git clone https://git ...

  3. tty命令详解

    基础命令学习目录首页 原文链接:http://blog.chinaunix.net/uid-9525959-id-2001836.html [功能]  打印连接到标准输入的终端的文件名. [描述]  ...

  4. Refs 和 DOM

    在常规的 React 数据流中,props 是父组件与子组件交互的唯一方式.要修改子元素,你需要用新的 props 去重新渲染子元素.然而,在少数情况下,你需要在常规数据流外强制修改子元素.被修改的子 ...

  5. [BUAA软工]第零次博客作业---问题回答

    [BUAA软工]第0次博客作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 第0次个人作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能力 这个作业在哪 ...

  6. 在ASP.NET里实现计算器代码的封装

    一.具体代码 Default2.aspx.cs public partial class Chapter1_Default2 : System.Web.UI.Page { protected void ...

  7. Leetcode题库——19.删除链表的倒数第 n 个节点【##】

    @author: ZZQ @software: PyCharm @file: removeNthFromEnd.py @time: 2018/9/26 21:56 说明:给定一个链表,删除链表的倒数第 ...

  8. java中static使用之静态方法注意点

    1.静态方法可以直接调用同类中的静态成员,但是不能直接调用非静态成员,这是为什么呢?大家想一下,静态成员在对象创建之前就要写入内存,所以它在内存中是实实在在的存在的,而非静态还不存在内存中,所以不能调 ...

  9. 校园跳蚤市场-Sprint计划

    一.现状 小组成员初步了解所做项目的大致内容,需要时间一步一步分析和规划. 二.部分需求索引卡 第一个阶段完成项目的其中一个模块(商品信息模块). 三.任务认领 产品负责人:林海信 Master:何武 ...

  10. 材料设计---Design

    效果: main_activity.xml <?xml version="1.0" encoding="utf-8"?> <!--Coordi ...