zoukankan      html  css  js  c++  java
  • java Stack 栈

    先来看一个生活场景:乘坐垂直电梯

    先定一个规矩:进入电梯的每个人尽量电梯里面走。

    那么就会出现:最先进入电梯的人最后出电梯(在到达相同楼层的情况下);

    栈就是这样一种结构:

    Java类库中提供了Stack类来实现栈,并且是范型类可以存储不同的数据结构,Stack 类方法:

    boolean empty() :栈是否为空

    Object peek( )  :查看栈顶元素

    Object pop( )     :移除栈顶元素

    Object push(Object obj)    :添加元素

    int search(Object element) : 自顶向下查找元素

    import java.util.Stack;
    public class Test {
        public static void main(String[] args) {
            System.out.println("Integer 类型:");
            Stack<Integer> st = new Stack<Integer>();
            st.push(1);
            st.push(2);
            System.out.println("添加元素之后 栈顶元素:" +st.peek()+ " 是否为空:"+st.empty()+" 栈1内所有元素:" + st);
            st.pop();
            st.pop();
            System.out.println("移除元素之后");
            System.out.println("是否为空:"+st.empty());
            
            System.out.println();
            System.out.println("自定义 类型:");
            Stack<MyObj> so = new Stack<MyObj>();
            so.push(new MyObj(3,"自定义对象3"));
            so.push(new MyObj(4,"自定义对象4"));
            System.out.println("添加元素之后  栈顶元素:" +so.peek().name+ " 是否为空:"+so.empty());
            so.pop();
            so.pop();
            System.out.println("移除元素之后");
            System.out.println("是否为空:"+so.empty());
    
        }
    }
    class MyObj{
        Integer id;
        String name;
        
        MyObj(int id,String name){
            this.id=id;
            this.name=name;
        }
    }

    两种栈的实现方式:

    用数组实现栈:只需要定义一个栈顶指针指向栈顶元素即可,当要添加数据时指针往后移动,当要删除数据时指针往前移动。

           在入栈的时候如果栈已经满了,那么拓展内存,在出栈的时候如果栈为空返回null;

    import java.util.Arrays;
    
    //范型类型、创建的时候指定数据类型
    public class ArrayStack<E> {
        private Object[] stack;
        private int index;
        ArrayStack() {
            stack = new Object[10];
            index = 0;                //栈顶地址
        }
    
        public boolean isEmpty() {
            return index == 0;
        }
    
        public E peek() {
            if (isEmpty()) {
                return null;
            }
            return (E)stack[index-1];
        }
    
        public E pop() {
            if (isEmpty()) {
                return null;
            }
            index--;
            return (E)stack[index];
        }
    
        //拓展内存
        private void ensureCapacity(int index) {
            if (index > stack.length) {
                int len = stack.length + 10;
                stack = Arrays.copyOf(stack, len);
            }
        }
    
        public E push(E e) {
            ensureCapacity(index+1);
            stack[index++] = e;
            return e;
        }
    
        public static void main(String[] args) {
            ArrayStack<String> stack = new ArrayStack<>();
            stack.push("a");
            stack.push("b");
        
            System.out.println("栈顶元素:"+stack.peek());
            System.out.println("栈顶元素出栈:"+stack.pop());
            System.out.println("栈顶元素出栈:"+stack.pop());
            System.out.println("栈顶元素出栈:"+stack.pop());
        }
    }

    链表实现栈结构:当添加节点的时候栈顶元素为新添加的节点,该节点的next指向之前的节点,当删除元素时候当前节点指向下一个节点即可

    //链表数据结构
    class Node<E> {
        Node<E> next = null;    
        E data;
        public Node(E data) {
            this.data = data;
        }
    }
    
    //链表实现栈数据结构
    public class ListNodeStack<E> {
        Node<E> top = null;
    
        boolean isEmpty() {
            return top == null;
        }
    
        public void push(E item) {
            Node<E> node = new Node<E>(item);
            node.next = top;
            top = node;
        }
    
        public E pop() {
            if (this.isEmpty()) return null;
            E data = top.data;
            top = top.next;
            return data;
        }
    
        public E peek() {
            if (this.isEmpty()) return null;
            return top.data;
        }
    
        public static void main(String[] args) {
            ListNodeStack<Integer> stack = new ListNodeStack<>();
            System.out.println("入栈");
            stack.push(1);
            stack.push(2);
            System.out.println("出栈:"+stack.pop());
            System.out.println("出栈:"+stack.pop());
             System.out.println("栈为空?"+stack.isEmpty());
        }
    }
  • 相关阅读:
    MVC HtmlHelper用法大全
    mysql查询结果输出到文件
    未能加载文件或程序集“Autofac, Version=3.4.0.0,
    IHttpModule接口
    演练:创建和注册自定义 HTTP 模块
    Tablespace for table '`pomelo`.`bag`' exists. Please DISCARD the tablespace before IMPORT.
    java开发知识IO知识之输入输出流以及文件
    Java开发知识之Java中的Map结构
    Java开发知识之Java中的集合Set接口以及子类应用
    Java开发知识之Java中的集合上List接口以及子类讲解.
  • 原文地址:https://www.cnblogs.com/easyidea/p/13534060.html
Copyright © 2011-2022 走看看