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. FFMS2 官方说明译文 [原创]

    原文:https://github.com/FFMS/ffms2 译文:http://www.cnblogs.com/popapa/p/ffms2.html 采集日期:2018-3-18 FFmpeg ...

  2. swap分区和内存

    1  查看swap 空间大小(总计):      # free -m          默认单位为k, -m 单位为M                total       used       fr ...

  3. python-gevent模块(自动切换io的协程)

    2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import gevent     def foo() ...

  4. MVC 漫长之路(一)

    1.新建项目 mvc  视图引擎选中 Razor   2.允许我们设置这个项目关于 MVC 的一些设置,确认选中了“空”项目模板   3.   4.打开 Global.asax 文件 配置路由名称等 ...

  5. 实验三 敏捷开发和XP实验

    课程:Java程序设计实验   班级:1352             姓名: 于佳心           学号:20135206 成绩:               指导教师:娄嘉鹏         ...

  6. Task 6.4 冲刺Two之站立会议4

    今天对主界面部分的代码进行了完善,因为主界面有对于用户账号的设置.包括头像修改.增删好友.进入聊天界面等功能,包含的内容很多.我主要是负责跟聊天界面的连接以及账号设置的部分:遇到的问题有,因为这部分依 ...

  7. servlet 路径问题

    首先明确绝对路径与相对路径,绝对路径:相对于盘符的路径c://a.txt,相对路径格式如/web/hello.jsp.还有一个是网络路径http://www.baidu.com/...... 一般来说 ...

  8. Hibernate笔记③--集合映射、组合映射、联合主键、查询案例

    lazy 懒加载 默认为proxy   继承映射 discriminant column="type" type="string"   集合映射 生成表的语句: ...

  9. POJ 3744 Scout YYF I 概率dp+矩阵快速幂

    题目链接: http://poj.org/problem?id=3744 Scout YYF I Time Limit: 1000MSMemory Limit: 65536K 问题描述 YYF is ...

  10. nodeJS + webStrome

    一.配置开发环境: 1.先安装node (1).访问http://nodejs.org打开安装包,正常安装,点击next即可. 为了测试是否安装成功,打开命令提示符,输入node,则进入node.js ...