实现栈、队列、链表数据结构


1. 数组实现栈




[Java] 纯文本查看 复制代码




​?​



01


02


03


04


05


06


07


08


09


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


44


45


46


47


48


49


50


51


52


53


54


55


56


57


58


59


60


61


62


63


64


65


66




​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] 纯文本查看 复制代码




​?​



01


02


03


04


05


06


07


08


09


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


44


45


46


47


48


49


50




​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] 纯文本查看 复制代码




​?​



01


02


03


04


05


06


07


08


09


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


44


45


46


47


48


49


50


51


52


53


54


55


56


57


58


59


60


61


62


63


64


65


66


67


68


69


70


71


72


73


74


75


76


77


78


79


80


81


82


83


84


85


86


87


88


89


90


91


92




​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.循环链表

<ignore_js_op>实现栈、队列、链表数据结构(java)_链表 



5.双向循环链表


[Java] 纯文本查看 复制代码




​?​



01


02


03


04


05


06


07


08


09


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42




​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;​


​}​


 


​}​