• 自定义栈的实现及使用两个栈模拟队列


    一,使用单链表实现栈

    ①栈需要一个栈顶指针

    ②栈的基本操作有出栈和入栈,以及判断栈是否为空

    ③单链表中每个结点表示一个栈元素,每个结点有指向下一个结点的指针。因此,在栈内部需要实现一个单链表。代码如下:

    public class Stack<T extends Comparable<? super T>>{
        private class Node{
            T ele;
            Node next;
            
            public Node(T ele) {
                this.ele = ele;
            }
        }
        
        Node top;//栈顶指针
        
        public void push(T ele){
            Node n = new Node(ele);
            n.next = top;
            top = n;
        }
        public T pop(){
            if(top != null)
            {
                Node tmp = top.next;
                T ele = top.ele;
                top.next = null;
                top = tmp;
                return ele;
            }
            return null;
        }
        
        public boolean isEmpty(){
            return top == null;
        }
    }

    二,使用两个栈实现队列

    ①栈是先进后出,而队列是先进先出。要实现队列,就需要实现队列的基本操作,并使基本操作满足先进先出的特点。

    这里需要两个栈,一个是enStack,当有元素入队列时,一律Push到这个栈中。另一个栈是deStack,当有元素出队列时:

    先检查deStack是否为空,若不为空,则从deStack中pop元素出去,作为出队列的元素。当deStack为空时,将enStack中的元素出栈,放push进deStack中,然后再从deStack中出栈。

    如果enStack 和 deStack 都为空,则出队列操作返回null,代码实现如下:

    public class MyQueue<T extends Comparable<? super T>> {
        private Stack<T> enStack;
        private Stack<T> deStack;
        
        public MyQueue() {
            enStack = new Stack<T>();
            deStack = new Stack<T>();
        }
        
        public void enqueue(T ele){
            enStack.push(ele);
        }
        
        public T dequeue(){
            if(!deStack.isEmpty())
            {
                return deStack.pop();
            }
            while(!enStack.isEmpty()){
                deStack.push(enStack.pop());
            }
            return deStack.pop();
        }
        
        public boolean isEmpty(){
            return enStack.isEmpty() && deStack.isEmpty();
        }
    }

    总结:不管是用栈模拟队列,还是用队列模拟栈,其本质都是如何一种数据结构的特性去实现另一种数据结构的特性。

  • 相关阅读:
    Fetch超时设置和终止请求
    Base64编码
    H5与企业微信jssdk集成
    构建multipart/form-data实现文件上传
    WebWorker与WebSocket实现前端消息总线
    netty源码解析(4.0)-22 ByteBuf的I/O
    netty源码解析(4.0)-21 ByteBuf的设计原理
    netty源码解析(4.0)-20 ChannelHandler: 自己实现一个自定义协议的服务器和客户端
    netty源码解析(4.0)-19 ChannelHandler: codec--常用编解码实现
    netty源码解析(4.0)-18 ChannelHandler: codec--编解码框架
  • 原文地址:https://www.cnblogs.com/hapjin/p/5635918.html
Copyright © 2020-2023  润新知