zoukankan      html  css  js  c++  java
  • 3.2_栈_链式存储结构(链表形式)

    【链式存储结构】

    栈的链式存储结构,简称链栈。

    【具体实现】

    package com.Higgin.LinkStack;
    
    import java.util.EmptyStackException;
    
    /**
     *  使用链表的形式实现栈
     */
    public class MyStack {
        /**
         * 结点内部类
         */
        class Node{
            private Object obj;     //数据域
            private Node next;     //指针域
            public Node(Object obj, Node next) {
                this.obj = obj;
                this.next = next;
            }
            public Node(Object obj){
                this(obj,null);
            }
            public Node(){
                this(null,null);
            }
        }
        
        private Node top;  //栈顶指针
        private int count; //栈含有的对象数量
        
        public MyStack(){
            this.top=new Node();
            this.count=0;
        }
        /**
         * 返回栈中的已存的元素个数
         */
        public int size(){
            return this.count;
        }
        /**
         *  判断是否为空栈
         */
        public boolean empty(){
            return count==0;
        }
        /**
         * 插入对象obj为新的栈顶对象
         */
        public void push(Object obj){
            Node newNode=new Node(obj);
            newNode.next=top;  //把当前的栈顶元素赋值给新结点的直接后继
            top=newNode;       //然后将新结点newNode赋值给栈顶指针
            this.count++;
        }
        
        /**
         * 获取栈顶的节点
         */
        public Node peekNode(){
            if(size()==0){
                throw new EmptyStackException();
            }
            return top;
        }
        
        /**
         *  获取栈顶元素,但不删除
         */
        public Object peek(){
            if(size()==0){
                throw new EmptyStackException();
            }
            return top.obj;
        }
        
        /**
         * 出栈,返回被弹出的节点的数据域对象
         */
        public Object pop(){
            Object oldObj=peek();  //获取栈顶 里面包含了是否为空栈的判断
            Node oldNode=top;
            top=top.next;
            this.count--;
            oldNode.obj=null;
            oldNode.next=null;
            return oldObj;
        }
        
        /**
         * 查找对象的位置,查找的是pop返回1,没有0
         */
        public int search(Object obj){
            if(size()==0){
                throw new EmptyStackException();
            }
            Node curNode=top;
            int i=1;
            while(curNode.next!=null){
                if(obj.equals(curNode.obj)){
                    return i;
                }
                curNode=curNode.next;
                i++;
            }
            return -1;
        }
    }

    【测试】

    package com.Higgin.LinkStack;
    
    public class TestMyStack {
        public static void main(String[] args) {
            MyStack ms=new MyStack();
            System.out.println("是否为空==="+ms.empty());                //true
            ms.push(11);
            ms.push(22);
            ms.push(33);
            System.out.println("最近一次添加的是33==="+ms.peek());         //33
            ms.push(44);
            ms.push(55);
            System.out.println("最近一次添加的是55==="+ms.peek());         //55
            System.out.println("寻找22的位置==="+ms.search(22));          //4
            ms.push(22);
            System.out.println("寻找22的位置==="+ms.search(22));          //1
            System.out.println("寻找55的位置==="+ms.search(55));          //1
            System.out.println("寻找99的位置(不存在)==="+ms.search(99));   //-1
            ms.pop(); 
            System.out.println("执行了一次pop,栈顶的元素==="+ms.peek());  //44
            System.out.println("栈移除了之后的长度为===="+ms.size());      //4
        }
    }

    【运行结果】

  • 相关阅读:
    Node.js 学习记录 原生的方案开发API接口
    Node.js 学习记录 打造博客系统 前期分析
    Node.js 学习记录 server端和前端开发的区别
    Node.js 学习记录 创建server初体验
    Node.js 学习记录 ES vs Node.js vs Javascript
    Node.js 学习记录 文件之间调用
    禁止浏览器加载favicon.ico文件
    element ui 单选 修改为 多选的样式(小√)
    net core 报表工具使用说明
    推荐一款性价比特别高的HighReport工具-大屏可视化报表
  • 原文地址:https://www.cnblogs.com/HigginCui/p/6101683.html
Copyright © 2011-2022 走看看