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. phpcmsv9广告版位调用方法

    <div class="ya"> <?php // pc:get 使用sql语句获取指定条件的广告版位! ?> {pc:get sql="SELE ...

  2. PLSQL触发器,游标

    --触发器 drop table emp_log create table emp_log( empno number, log_date date, new_salary number, actio ...

  3. python-模拟掷骰子,两个筛子数据可视化

    """ 作者:zxj 功能:模拟掷骰子,两个筛子数据可视化 版本:3.0 日期:19/3/24 """ import random impo ...

  4. route命令详情

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/lpfuture/p/5857738.html 考试题一:linux下如何添加路由(百度面试题) 以上是原题,老男孩老师 ...

  5. 第33次Scrum会议(11/21)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/21 11:35~11:57,总计22min.地点:东北 ...

  6. NABC for Teamproject

     “教育是一个社会发展的支柱, 你和我能看到并理解这个博客, 教育功不可没. 高等教育的形式并不是一成不变的, 高等教育一直在演进.”邹欣老师在博客上如此写道.为了迎合信息化时代的特色,网络上的知识传 ...

  7. 20172308 实验三《Java面向对象程序设计 》实验报告

    20172308 2017-2018-2 <程序设计与数据结构>实验三报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 周亚杰 学号:20172308 实验教师:王 ...

  8. Beta冲刺(5/7)

    队名:天机组 组员1友林 228(组长) 今日完成:修改代码 明天计划:封装代码 剩余任务:优化网络通讯机制 主要困难:暂无 收获及疑问:暂无 组员2方宜 225 今日完成:优化了ui界面 明天计划: ...

  9. 转 C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)

    原创性申明 本文作者:小竹zz  博客地址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879转载请注明出处引言 我一直在探寻一个高性能 ...

  10. 交换机、linux光衰查询

    RX收光,TX发光 一.交换机 命令: display interface transceiver brief 结果: ...... HW6851 10GE1/0/15 transceiver dia ...