黑马程序员技术交流社区

标题: 【上海校区】实现栈、队列、链表数据结构(java) [打印本页]

作者: biu波儿了罢    时间: 2019-10-31 15:23
标题: 【上海校区】实现栈、队列、链表数据结构(java)
本帖最后由 biu波儿了罢 于 2019-10-31 15:25 编辑

                                                     实现栈、队列、链表数据结构
1. 数组实现栈
[Java] 纯文本查看 复制代码
public class MyStack {
        // 栈的底层使用数组来存储数据
        int[] elements;
        public MyStack() {
                elements = new int[0];
        }

        // 压入元素
        public void push(int element) {
            //创建一个新的数组
                int[] newArr = new int[elements.length + 1];
                // 把数组中的元素复制到新数组中
                for (int i = 0; i < elements.length; i++) {
                        newArr = elements;
                }
                // 把添加的元素放入新的数组中
                newArr[elements.length] = element;
                // 使用新数组替换旧数组
                elements = newArr;
        }

        public int pop() {
                // 栈中没有元素
                if (elements.length == 0) {
                        throw new RuntimeException("stack is empty");
                }
                // 取出数组的最后一个元素
                int element = elements[elements.length - 1];
                // 创建一个新的数组
                int[] newArr = new int[elements.length - 1];
                // 原数组中除了最后一个元素的其它元素放入新的数组中
                for (int i = 0; i < elements.length - 1; i++) {
                        newArr = elements;
                }
                // 替换数组
                elements = newArr;
                // 返回栈顶元素
                return element;
        }

        // 查看栈顶元素
        public int peek() {
                // 栈中没有元素
                if (elements.length == 0) {
                        throw new RuntimeException("stack is empty");
                }
                return elements[elements.length - 1];
        }

        // 判断栈是否为空
        public boolean isEmpty() {
                return elements.length == 0;
        }
//test
        public static void main(String[] args) {
                MyStack ms = new MyStack();
//                ms.push(9);
//                ms.push(8);
//                ms.push(7);
                System.out.println(ms.peek());
//                System.out.println(ms.pop());
                System.out.println(ms.isEmpty());
//                System.out.println(ms.pop());
//                System.out.println(ms.pop());
        }
}

2.数组实现队列
[Java] 纯文本查看 复制代码
public class MyQueue {
                int[] elements;
                public MyQueue() {
                        elements=new int[0];
                }
               
                //入队
                public void add(int element) {
                        //创建一个新的数组
                        int[] newArr = new int[elements.length + 1];
                        // 把数组中的元素复制到新数组中
                        for (int i = 0; i < elements.length; i++) {
                                newArr = elements;
                        }
                        // 把添加的元素放入新的数组中
                        newArr[elements.length] = element;
                        // 使用新数组替换旧数组
                        elements = newArr;
                }
               
                //出队
                public int poll() {
                        //把数组中的第0个元素取出来
                        int element = elements[0];
                        //创建一个新的数组
                        int[] newArr = new int[elements.length-1];
                        //复制原数组中的元素到新的数组中
                        for(int i=0;i<newArr.length;i++) {
                                newArr=elements[i+1];
                        }
                        //替换数组
                        elements=newArr;
                        return element;
                }
               
                //判断队列是否为空
                public boolean isEmpty() {
                        return elements.length==0;
                }
                //test
                public static void main(String[] args) {
                        MyQueue mq=new MyQueue();
                        mq.add(9);
                        mq.add(8);
                        mq.add(7);
                        System.out.println(mq.poll());
                        mq.add(6);
                        System.out.println(mq.poll());               
                }        
}


3.单链表实现
[Java] 纯文本查看 复制代码
public class Node {
        //节点内容
        int data;
        //下一个节点
        Node next;
        
        public Node(int data) {
                this.data=data;
        }
        
        //为节点追加节点
        public Node append(Node node) {
                //当前节点
                Node currentNode=this;
                //循环向后找
                while(true) {
                        //取出下一个节点
                        Node nextNode=currentNode.next;
                        //如果下一个节点为null,当前节点已经是最后一个节点
                        if(nextNode==null) {
                                break;
                        }
                        //赋给当前节点
                        currentNode=nextNode;
                }
                //把需要追回的节点追加为找到的当前节点的下一个节点
                currentNode.next=node;
                return this;
        }
        
        //插入一个节点作为当前节点的下一个节点
        public void after(Node node) {
                //取出下一个节点,作为下下一个节点
                Node nextNext=next;
                //把新节点作为当前节点的下一个节点
                this.next=node;
                //把下下一个节点设置为新节点的下一个节点
                node.next=nextNext;
        }
        
        //显示所有节点信息
        public void show() {
                Node currentNode = this;
                while(true) {
                        System.out.print(currentNode.data+" ");
                        //取出下一个节点
                        currentNode=currentNode.next;
                        //如果是最后一个节点
                        if(currentNode==null) {
                                break;
                        }
                }
                System.out.println();
        }
        
        //删除下一个节点
        public void removeNext() {
                //取出下下一个节点
                Node newNext = next.next;
                //把下下一个节点设置为当前节点的下一个节点
                this.next=newNext;
        }
        
        //获取下一个节点
        public Node next() {
                return this.next;
        }
        
        //获取节点中的数据
        public int getData() {
                return this.data;
        }
        
        //当前节点是否是最后一个节点
        public boolean isLast() {
                return next==null;
        }
        
        //test  
        public static void main(String[] args) {
                Node n1=new Node(1);
                Node n2=new Node(2);
                Node n3=new Node(3);
                n1.append(n2).append(n3).append(new Node(4));
//                System.out.println(n1.next().next().next().getData());
//                System.out.println(n1.next().next().isLast());
                n1.show();
                n1.next().removeNext();
                n1.show();
        }
        
}



4.循环链表



5.双向循环链表
[Java] 纯文本查看 复制代码
public class DoubleNode {
        // 上一个节点
        DoubleNode pre = this;
        // 下一个节点
        DoubleNode next = this;
        // 节点数据
        int data;

        public DoubleNode(int data) {
                this.data = data;
        }

        // 新增节点
        public void after(DoubleNode node) {
                // 原来的下一个节点
                DoubleNode nextNext = next;
                // 把新节点作为当前节点的下一个节点
                this.next = node;
                // 把当前节点作为新节点的前一个节点
                node.pre = this;
                // 让原来的下一个节点作为新节点的下一个节点
                node.next = nextNext;
                // 让新节点作为原来的下一个节点的前一个节点
                nextNext.pre = node;
        }

        // 下一个节点
        public DoubleNode next() {
                return this.next;
        }

        // 上一个节点
        public DoubleNode pre() {
                return this.pre;
        }
        
        //获取数据
        public int getData() {
                return this.data;
        }
        
}




文章摘自:https://blog.csdn.net/hnu_zzt/article/details/90742026





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2