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. MAC node + git + bower 简单安装

    一 node 安装 打开https://nodejs.org/en/ nodejs官网 下载安装文件 双击.pkg 文件 自动安装即可 二 安装git 打开 http://code.google.co ...

  2. 调试存储过程:ORA-0131 Insufficient privileges

    http://www.cnblogs.com/empty01/p/5568250.html

  3. Shell重新学习(忘光了)

    成功和失败都放同一个文件 调试shell

  4. sprint2(第六天)

    昨天休息一天,今天继续做任务. 燃尽图:

  5. 《UML大战需求分析》-读后感三

    用例图是用来描述什么角色通过某某系统能做什么的图,用例图关注的是系统的外在表示想爱你.系统与人的交互系统与其他系统的交互,小人执行者就是角色,角色 是对系统使用者的抽象,一个角色可以代表多个具体的人而 ...

  6. C# winForm调用WebService

    C#winForm调用WebService的远程接口 创建一个WebService工程用例 添加服务引用 添加webService服务地址 输入命名空间名称 主要代码 测试成功截图 工程代码下载 新建 ...

  7. 重温servlet①

    Servlet是单例的,是线程不安全的.比较灵活,但是容易会使两个线程产生错误 类由我们自己来写,对象由服务器生成,方法由服务器自己调用.   一个servletconfig对象对应着一段web.xm ...

  8. my everying

    evering -> everything 一.请回望暑假时的第一次作业,你对于软件工程课程的想象 1)对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强计算机专业的能力和就业竞 ...

  9. angularJS1笔记-(16)-模块里的constant、value、run

    index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  10. Current request is not a multipart request

    1. 文件上传需要在form表单中添加<form enctype="multipart/form-data"> 2. SpringMVC默认是关闭fileupload功 ...