zoukankan      html  css  js  c++  java
  • 栈Stack(使用自定义链表实现自定义栈)

    从上一篇博客链表( 自定义链表)知道,链表如果增删只对链表头操作O(1), 查找链表头元素O(1) ,这样的操作符合栈这个数据结构。

    下面我们使用自定义链表实现自定义栈

    1、前面定义的栈接口

    public interface IStack<E> {
        int getSize();
        boolean isEmpty();
        void push(E e);
        E pop();
        E peek();
    }
    

      

    2、自定义栈。

    LinkedList类来自链表( 自定义链表)

    public class LinkedListStack<E> implements IStack<E> {
    
    
        private LinkedList<E> list;
    
        public LinkedListStack(){
            list = new LinkedList<E>();
        }
    
        public int getSize() {
            return list.getSize();
        }
    
        public boolean isEmpty() {
            return list.isEmpty();
        }
    
        public void push(E e) {
            list.addFirst(e);
        }
    
        public E pop() {
            return list.removeFirst();
        }
    
        public E peek() {
            return list.getFirst();
        }
    
        @Override
        public String toString() {
            StringBuilder res = new StringBuilder();
            res.append("栈Stack: (左侧栈顶) ");
            res.append(list);
            return  res.toString();
    
        }
    
        public static void main(String[] args) {
            LinkedListStack<Integer> stack = new LinkedListStack<Integer>();
            for(int i = 0; i < 5; i++){
                stack.push(i);
                System.out.println(stack);
    
            }
    
            System.out.println("出栈 pop stack...");
            stack.pop();
            System.out.println(stack); //输出: Stack: [0, 1, 2, 3]
        }
    }
    

      

    测试:

    public static void main(String[] args) {
            LinkedListStack<Integer> stack = new LinkedListStack<Integer>();
            for(int i = 0; i < 5; i++){
                stack.push(i);
                System.out.println(stack);
    
            }
    
            System.out.println("出栈 pop stack...");
            stack.pop();
            System.out.println(stack); //输出: Stack: [0, 1, 2, 3]
        }
    

      

    测试结果如下:

    栈Stack: (左侧栈顶) 链表头 0->NULL
    栈Stack: (左侧栈顶) 链表头 1->0->NULL
    栈Stack: (左侧栈顶) 链表头 2->1->0->NULL
    栈Stack: (左侧栈顶) 链表头 3->2->1->0->NULL
    栈Stack: (左侧栈顶) 链表头 4->3->2->1->0->NULL
    出栈 pop stack...
    栈Stack: (左侧栈顶) 链表头 3->2->1->0->NULL
    

      

     3、数组实现的栈和链表实现的栈进行比较

    public class TowStackCompareTest {
        //测试使用stack运行opCount个push和pop操作所需要的时间,单位: 秒
        private static double testStack(IStack<Integer> q, int opCount) {
            long startTime = System.nanoTime();
            Random random = new Random();
            for (int i = 0; i < opCount; i++) {
                q.push(random.nextInt(Integer.MAX_VALUE));
            }
            for (int i = 0; i < opCount; i++) {
                q.pop();
            }
            long endTime = System.nanoTime();
    
            return (endTime - startTime) / 1000000000.0;
        }
    
        public static void main(String[] args) {
            int opCount = 1000000;
    
            ArrayStack<Integer> arrayQueue = new ArrayStack<Integer>();
            double time1 = testStack(arrayQueue, opCount);
            System.out.println("ArrayStack, time: " + time1 + "秒");
    
            LinkedListStack<Integer> linkedListStack = new LinkedListStack<Integer>();
            double time2 = testStack(linkedListStack, opCount);
            System.out.println("LinkedListStack, time: " + time2 + "秒");
    
        }
    }  

    输出结果如下:

    ArrayStack, time: 0.065099119秒
    LinkedListStack, time: 0.246462526秒
    

      

    将opCount 改成10000000;

    int opCount = 10000000;

    输出结果如下:

    ArrayStack, time: 2.446045165秒
    LinkedListStack, time: 5.529615999秒  

    这是因为使用链表,需要创建Node(New空间),这个动作比较耗时。

    作者:Work Hard Work Smart
    出处:http://www.cnblogs.com/linlf03/
    欢迎任何形式的转载,未经作者同意,请保留此段声明!

  • 相关阅读:
    Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
    【提供笔试面试题参考】阿里巴巴,淘宝技术部,针对21届应届生的内推机会
    谈谈我眼中的CSDN吧
    我的2014碎碎念—学习篇、实习篇、工作篇、生活篇
    推荐几款我一直在用的chrome插件(下)
    推荐几款我一直在用的chrome插件(上)
    逛自己的微博,回顾曾经的那个“我”
    Java五道输出易错题解析(避免小错误)
    程序员和产品经理是怎么互相看的?贬低还是赞扬?
    现实中如何评判路遥《人生》中的高加林?
  • 原文地址:https://www.cnblogs.com/linlf03/p/14391444.html
Copyright © 2011-2022 走看看