• Java中栈结构的自我实现


    package com.pinjia.shop.common.collection;
    
    /**
     * Created by wangwei on 2017/1/3.
     */
    public class MyLinkedStack<T> {
        //定义节点数据结构
        private class Node{
            public T data;
            public Node next;
            public Node(){}
            public Node(T data,Node next){
                this.data = data;
                this.next = next;
            }
        }
    
        //栈顶元素
        private Node top;
        //元素个数
        private int size;
        //插入元素
        public void push(T element){
            top = new Node(element,top);
            size++;
        }
        //出栈操作
        public T pop(){
            Node oldNode = top;
            top = top.next;
            //释放引用
            oldNode.next = null;
            size--;
            return oldNode.data;
        }
    
        //返回栈顶元素,但不出栈
        public T peek(){
            return top.data;
        }
    
        //栈长度
        public int length(){
            return size;
        }
    
        //判断链栈是否为空栈
        public boolean empty(){
            return size == 0;
        }
    
        public String toString(){
            //链栈为空时
            if(empty())
                return "[]";
            else{
                StringBuilder sb = new StringBuilder("[");
                for(Node current = top;current != null;current = current.next){
                    sb.append(current.data.toString()+", ");
                }
                int len = sb.length();
                return sb.delete(len-2,len).append("]").toString();
            }
        }
        public static void main(String[] args) {
            MyLinkedStack<String> stack = new MyLinkedStack<String>();
            // 不断地入栈
            stack.push("aaaa");
            stack.push("bbbb");
            stack.push("cccc");
            stack.push("dddd");
            System.out.println(stack);
            // 访问栈顶元素
            System.out.println("访问栈顶元素:" + stack.peek());
            // 弹出一个元素
            System.out.println("第一次弹出栈顶元素:" + stack.pop());
            // 再次弹出一个元素
            System.out.println("第二次弹出栈顶元素:" + stack.pop());
            System.out.println("两次pop之后的栈:" + stack);
        }
    }
    

      

    以下是基于数组的实现:

    package com.pinjia.shop.common.collection;
    
    /**
     * Created by wangwei on 2017/1/3.
     */
    public class MyArrayStack<T> {
        private Object[] objs = new Object[16];
        private int size = 0;
    
        public boolean isEmpty() {
            return size == 0;
        }
    
        public void clear() {
            // 将数组中的数据置为null, 方便GC进行回收
            for (int i = 0; i < size; i++) {
                objs[size] = null;
            }
            size = 0;
        }
    
        public int length() {
            return size;
        }
    
        public boolean push(T data) {
            // 判断是否需要进行数组扩容
            if (size >= objs.length) {
                resize();
            }
            objs[size++] = data;
            return true;
        }
    
        /**
         * 数组扩容
         */
        private void resize() {
            Object[] temp = new Object[objs.length * 3 / 2 + 1];
            for (int i = 0; i < size; i++) {
                temp[i] = objs[i];
                objs[i] = null;
            }
            objs = temp;
        }
    
        public T pop() {
            if (size == 0) {
                return null;
            }
            return (T) objs[--size];
        }
    
        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append("MyArrayStack: [");
            for (int i = 0; i < size; i++) {
                sb.append(objs[i].toString());
                if (i != size - 1) {
                    sb.append(", ");
                }
            }
            sb.append("]");
            return sb.toString();
        }
    
        public static void main(String[] args) {
            MyArrayStack<Integer> stack = new MyArrayStack<Integer>();
            stack.push(12);
            stack.push(13);
            System.out.println(stack.length());
            System.out.println(stack);
        }
    }
    

      

  • 相关阅读:
    Javascript的实例化与继承:请停止使用new关键字
    关于Unicode和URL encoding入门的一切以及注意事项
    Javascript: 从prototype漫谈到继承(2)
    你真的了解setTimeout和setInterval吗?
    javascript同步分页
    jquery ui dialog去除第一个文本框焦点问题
    指定范围内的随机数
    Mac下的mysql初始密码如何重置?
    进度条插件
    浏览器事件以及事件代理
  • 原文地址:https://www.cnblogs.com/shenlanzhizun/p/6245004.html
Copyright © 2020-2023  润新知