欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java之链表实现栈结构

程序员文章站 2023-11-07 10:22:40
package com.wzlove.stack; import java.util.Iterator; import java.util.NoSuchElementException; / 链表实现栈结构:栈的结构是先进后出,所以栈的结点也包括了两个部分 1.构造函数初始化栈 2.判空操作 3.栈 ......

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());
    }
}