数据结构Java02【栈、队列、单链表(增删节点)、循环链表、双向循环链表、递归(斐波那契、汉诺塔)】
學(xué)習(xí)地址:【數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)-java版】? ? ? ? ? ? ? ? ??🚀數(shù)據(jù)結(jié)構(gòu)--Java專欄🚀
- 筆記01【01-09】【概述、數(shù)組基本使用】【源碼、課件】
- 筆記02【10-18】【棧、隊(duì)列、單鏈表(增刪節(jié)點(diǎn))、循環(huán)鏈表、雙向循環(huán)鏈表、遞歸(斐波那契、漢諾塔)】
- 筆記03【19-27】【(時(shí)間、空間復(fù)雜度);八大排序(冒泡、快速、插入、希爾、選擇、歸并、基數(shù)、隊(duì)列基數(shù))】
- 筆記04【28-33】【樹結(jié)構(gòu)(二叉樹)概述、創(chuàng)建、遍歷、查找節(jié)點(diǎn)、刪除節(jié)點(diǎn)】
- 筆記05【34-39】【順序存儲二叉樹概述、二叉樹遍歷、堆排序、線索二叉樹實(shí)現(xiàn)及遍歷】
- 筆記06【40-48】【赫夫曼樹、概述、原理分析、代碼實(shí)現(xiàn)(數(shù)據(jù)壓縮、創(chuàng)建編碼表、解碼、壓縮文件、解壓文件)】
- 筆記07【49-54】【二叉排序樹(添加、查找、刪除節(jié)點(diǎn))】
- 筆記08【55-57】【二叉平衡樹(AVL)-概述、單旋轉(zhuǎn)、雙旋轉(zhuǎn)】
- 筆記09【58-60】【計(jì)算機(jī)中數(shù)據(jù)的存儲原理、2-3樹的插入原理、B樹和B+樹】
- 筆記10【61-63】【哈希表概述、散列函數(shù)的設(shè)計(jì)、散列沖突解決方案】
- 筆記11【64-67】【圖結(jié)構(gòu)概述、圖遍歷原理(BFS\DFS)、圖遍歷代碼實(shí)現(xiàn)】
目? ?錄
P10-2.8棧
1、MyStack.java【int】
2、MyStack.java【String】
3、TestMyStack.java
P11-2.9隊(duì)列
1、MyQueue.java
2、TestMyQueue.java
P12-2.10單鏈表
1、Node.java
2、TestNode.java
P13-2.11刪除單鏈表中的節(jié)點(diǎn)
P14-2.12往單鏈表中插入節(jié)點(diǎn)
P15-2.13循環(huán)鏈表
1、LoopNode.java
2、TestLoopNode.java
P16-2.14雙向循環(huán)鏈表
1、圖解
2、DoubleNode.java
3、TestDoubleNode.java
P17-2.15遞歸和斐波那契
1、TestRecursive.java
2、TestFebonacci.java
P18-2.16漢諾塔問題?
P10-2.8棧
1、MyStack.java【int】
package demo2;public class MyStack {// 棧的底層我們使用數(shù)組來存儲數(shù)據(jù)int[] elements;public MyStack() {elements = new int[0];}// 壓入元素public void push(int element) {// 創(chuàng)建一個(gè)新的數(shù)組int[] newArr = new int[elements.length + 1];// 把原數(shù)組中的元素復(fù)制到新數(shù)組中for (int i = 0; i < elements.length; i++) {newArr[i] = elements[i];}// 把添加的元素放入新數(shù)組中newArr[elements.length] = element;// 使用新數(shù)組替換舊數(shù)組elements = newArr;}// 取出棧頂元素public int pop() {// 棧中沒有元素if (elements.length == 0) {throw new RuntimeException("stack is empty");}// 取出數(shù)組的最后一個(gè)元素int element = elements[elements.length - 1];// 創(chuàng)建一個(gè)新的數(shù)組int[] newArr = new int[elements.length - 1];// 原數(shù)組中除了最后一個(gè)元素的其它元素都放入新的數(shù)組中for (int i = 0; i < elements.length - 1; i++) {newArr[i] = elements[i];}// 替換數(shù)組elements = newArr;// 返回棧頂元素return element;}// 查看棧頂元素public int pick() {// 棧中沒有元素if (elements.length == 0) {throw new RuntimeException("stack is empty");}return elements[elements.length - 1];}// 判斷棧是否為空public boolean isEmpty() {return elements.length == 0;}}2、MyStack.java【String】
package demo2;public class MyStack2 {// 棧的底層我們使用數(shù)組來存儲數(shù)據(jù)String[] elements;String[] str;// = new String[] {""};public MyStack2() {elements = new String[0];}// 壓入元素public void push(String element) {// 創(chuàng)建一個(gè)新的數(shù)組String[] newArr = new String[elements.length + 1];// 把原數(shù)組中的元素復(fù)制到新數(shù)組中for (int i = 0; i < elements.length; i++) {newArr[i] = elements[i];}// 把添加的元素放入新數(shù)組中newArr[elements.length] = element;// 使用新數(shù)組替換舊數(shù)組elements = newArr;}// 取出棧頂元素public String pop() {// 棧中沒有元素if (elements.length == 0) {throw new RuntimeException("stack is empty");}// 取出數(shù)組的最后一個(gè)元素String element = elements[elements.length - 1];// 創(chuàng)建一個(gè)新的數(shù)組String[] newArr = new String[elements.length - 1];// 原數(shù)組中除了最后一個(gè)元素的其它元素都放入新的數(shù)組中for (int i = 0; i < elements.length - 1; i++) {newArr[i] = elements[i];}// 替換數(shù)組elements = newArr;// 返回棧頂元素return element;}// 查看棧頂元素public String pick() {// 棧中沒有元素if (elements.length == 0) {throw new RuntimeException("stack is empty");}return elements[elements.length - 1];}// 判斷棧是否為空public boolean isEmpty() {return elements.length == 0;}}3、TestMyStack.java
package demo2.test;import demo2.MyStack; import demo2.MyStack2;public class TestMyStack {public static void main(String[] args) {// 創(chuàng)建一個(gè)棧MyStack ms = new MyStack();// 壓入數(shù)組ms.push(9);ms.push(8);ms.push(7);// 取出棧頂元素System.out.println(ms.pop());System.out.println(ms.pop());System.out.println(ms.pop());// 查看棧頂元素 // System.out.println(ms.pick());System.out.println(ms.isEmpty());System.out.println("/**------------------------------------------*/");MyStack2 ms2 = new MyStack2();ms2.push("1one");ms2.push("2two");ms2.push("3three");System.out.println(ms2.pick());System.out.println(ms2.pop());System.out.println(ms2.pop());System.out.println(ms2.pop());System.out.println(ms.isEmpty());}}P11-2.9隊(duì)列
1、MyQueue.java
package demo2;public class MyQueue {int[] elements;public MyQueue() {elements = new int[0];}// 入隊(duì)public void add(int element) {// 創(chuàng)建一個(gè)新的數(shù)組int[] newArr = new int[elements.length + 1];// 把原數(shù)組中的元素復(fù)制到新數(shù)組中for (int i = 0; i < elements.length; i++) {newArr[i] = elements[i];}// 把添加的元素放入新數(shù)組中newArr[elements.length] = element;// 使用新數(shù)組替換舊數(shù)組elements = newArr;}// 出隊(duì)public int poll() {// 把數(shù)組中的第0個(gè)元素取出來int element = elements[0];// 創(chuàng)建一個(gè)新的數(shù)組int[] newArr = new int[elements.length - 1];// 復(fù)制原數(shù)組中的元素到新數(shù)組中for (int i = 0; i < newArr.length; i++) {newArr[i] = elements[i + 1];}// 替換數(shù)組elements = newArr;return element;}// 判斷隊(duì)列是否為空public boolean isEmpty() {return elements.length == 0;}}2、TestMyQueue.java
package demo2.test;import demo2.MyQueue;public class TestMyQueue {public static void main(String[] args) {// 創(chuàng)建一個(gè)隊(duì)列MyQueue mq = new MyQueue();// 入隊(duì)mq.add(9);mq.add(8);mq.add(7);// 出隊(duì)System.out.println(mq.poll());mq.add(6);System.out.println(mq.poll());System.out.println(mq.poll());System.out.println(mq.isEmpty());System.out.println(mq.poll());}}P12-2.10單鏈表
java中 對象類型的引用中存儲的數(shù)據(jù),是 下一個(gè)對象的地址。
1、Node.java
package demo2;//一個(gè)節(jié)點(diǎn) public class Node {// 節(jié)點(diǎn)內(nèi)容int data;// 下一個(gè)節(jié)點(diǎn)Node next;public Node(int data) {this.data = data;}// 為節(jié)點(diǎn)追回節(jié)點(diǎn)public Node append(Node node) {// 當(dāng)前節(jié)點(diǎn)Node currentNode = this;// 循環(huán)向后找while (true) {// 取出下一個(gè)節(jié)點(diǎn)Node nextNode = currentNode.next;// 如果下一個(gè)節(jié)點(diǎn)為null,當(dāng)前節(jié)點(diǎn)已經(jīng)是最后一個(gè)節(jié)點(diǎn)if (nextNode == null) {break;}// 賦給當(dāng)前節(jié)點(diǎn)currentNode = nextNode;}// 把需要追回的節(jié)點(diǎn)追加為找到的當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)currentNode.next = node;return this;}// 插入一個(gè)節(jié)點(diǎn)做為當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)public void after(Node node) {// 取出下一個(gè)節(jié)點(diǎn),作為下下一個(gè)節(jié)點(diǎn)Node nextNext = next;// 把新節(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)this.next = node;// 把下下一個(gè)節(jié)點(diǎn)設(shè)置為新節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)node.next = nextNext;}// 顯示所有節(jié)點(diǎn)信息public void show() {Node currentNode = this;while (true) {System.out.print(currentNode.data + " ");// 取出下一個(gè)節(jié)點(diǎn)currentNode = currentNode.next;// 如果是最后一個(gè)節(jié)點(diǎn)if (currentNode == null) {break;}}System.out.println();}// 刪除下一個(gè)節(jié)點(diǎn)public void removeNext() {// 取出下下一個(gè)節(jié)點(diǎn)Node newNext = next.next;// 把下下一個(gè)節(jié)點(diǎn)設(shè)置為當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。this.next = newNext;}// 獲取下一個(gè)節(jié)點(diǎn)public Node next() {return this.next;}// 獲取節(jié)點(diǎn)中的數(shù)據(jù)public int getData() {return this.data;}// 當(dāng)前節(jié)點(diǎn)是否是最后一個(gè)節(jié)點(diǎn)public boolean isLast() {return next == null;}}2、TestNode.java
package demo2.test;import demo2.Node;public class TestNode {public static void main(String[] args) {// 創(chuàng)建節(jié)點(diǎn)Node n1 = new Node(1);Node n2 = new Node(2);Node n3 = new Node(3);// 追加節(jié)點(diǎn)n1.append(n2).append(n3).append(new Node(4));// 取出下一個(gè)節(jié)點(diǎn)的數(shù)據(jù)System.out.println(n1.next().next().next().getData());// 判斷節(jié)點(diǎn)是否為最后一個(gè)節(jié)點(diǎn)System.out.println(n1.isLast());System.out.println(n1.next().next().next().isLast());// 顯示所有節(jié)點(diǎn)內(nèi)容n1.show();// 刪除一個(gè)節(jié)點(diǎn)n1.next().removeNext();// 顯示所有節(jié)點(diǎn)內(nèi)容n1.show();// 插入一個(gè)新節(jié)點(diǎn)Node node = new Node(5);n1.next().after(node);n1.show();}}P13-2.11刪除單鏈表中的節(jié)點(diǎn)
P14-2.12往單鏈表中插入節(jié)點(diǎn)
節(jié)點(diǎn)4 插入到 2、3之間!?
P15-2.13循環(huán)鏈表
1、LoopNode.java
package demo2;//一個(gè)節(jié)點(diǎn) public class LoopNode {// 節(jié)點(diǎn)內(nèi)容int data;// 下一個(gè)節(jié)點(diǎn)LoopNode next = this;public LoopNode(int data) {this.data = data;}// 插入一個(gè)節(jié)點(diǎn)做為當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)public void after(LoopNode node) {// 取出下一個(gè)節(jié)點(diǎn),作為下下一個(gè)節(jié)點(diǎn)LoopNode nextNext = next;// 把新節(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)this.next = node;// 把下下一個(gè)節(jié)點(diǎn)設(shè)置為新節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)node.next = nextNext;}// 刪除下一個(gè)節(jié)點(diǎn)public void removeNext() {// 取出下下一個(gè)節(jié)點(diǎn)LoopNode newNext = next.next;// 把下下一個(gè)節(jié)點(diǎn)設(shè)置為當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。this.next = newNext;}// 獲取下一個(gè)節(jié)點(diǎn)public LoopNode next() {return this.next;}// 獲取節(jié)點(diǎn)中的數(shù)據(jù)public int getData() {return this.data;}}2、TestLoopNode.java
package demo2.test;import demo2.LoopNode;public class TestLoopNode {public static void main(String[] args) {LoopNode n1 = new LoopNode(1);LoopNode n2 = new LoopNode(2);LoopNode n3 = new LoopNode(3);LoopNode n4 = new LoopNode(4);// 增加節(jié)點(diǎn)n1.after(n2);n2.after(n3);n3.after(n4);System.out.println(n1.next().getData());System.out.println(n2.next().getData());System.out.println(n3.next().getData());System.out.println(n4.next().getData());}}P16-2.14雙向循環(huán)鏈表
1、圖解
2、DoubleNode.java
package demo2;public class DoubleNode {// 上一個(gè)節(jié)點(diǎn)DoubleNode pre = this;// 下一個(gè)節(jié)點(diǎn)DoubleNode next = this;// 節(jié)點(diǎn)數(shù)據(jù)int data;public DoubleNode(int data) {this.data = data;}// 增節(jié)點(diǎn)public void after(DoubleNode node) {// 原來的下一個(gè)節(jié)點(diǎn)DoubleNode nextNext = next;// 把新節(jié)點(diǎn)做為當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)this.next = node;// 把當(dāng)前節(jié)點(diǎn)做新節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)node.pre = this;// 讓原來的下一個(gè)節(jié)點(diǎn)作新節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)node.next = nextNext;// 讓原來的下一個(gè)節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn)為新節(jié)點(diǎn)nextNext.pre = node;}// 下一個(gè)節(jié)點(diǎn)public DoubleNode next() {return this.next;}// 上一個(gè)節(jié)點(diǎn)public DoubleNode pre() {return this.pre;}// 獲取數(shù)據(jù)public int getData() {return this.data;}}3、TestDoubleNode.java
package demo2.test;import demo2.DoubleNode;public class TestDoubleNode {public static void main(String[] args) {// 創(chuàng)建節(jié)點(diǎn)DoubleNode n1 = new DoubleNode(1);DoubleNode n2 = new DoubleNode(2);DoubleNode n3 = new DoubleNode(3);System.out.println(n1.pre().getData());System.out.println(n1.getData());System.out.println(n1.next().getData());// 追加節(jié)點(diǎn)n1.after(n2);n2.after(n3);// 查看上一個(gè)、自己、下一個(gè)節(jié)點(diǎn)的內(nèi)容System.out.println(n2.pre().getData());System.out.println(n2.getData());System.out.println(n2.next().getData());System.out.println(n3.next().getData());System.out.println(n1.pre().getData());}}P17-2.15遞歸和斐波那契
1、TestRecursive.java
package demo3;public class TestRecursive {public static void main(String[] args) {print(10);}// 遞歸public static void print(int i) { // if (i > 0) {System.out.println(i);print(i - 1); // }}}2、TestFebonacci.java
package demo3;public class TestFebonacci {public static void main(String[] args) {// 斐波那契數(shù)列:1 1 2 3 5 8 13int i = febonacci(7);System.out.println(i);}// 打印第n項(xiàng)斐波那契數(shù)列public static int febonacci(int i) {if (i == 1 || i == 2) {return 1;} else {return febonacci(i - 1) + febonacci(i - 2);}}}P18-2.16漢諾塔問題
漢諾塔小游戲:http://www.4399.com/flash/109504_1.htm
無論有多少個(gè)盤子,都認(rèn)為只有兩個(gè)!上面的所有盤子和最下面一個(gè)盤子。
package demo3;public class TestHanoi {public static void main(String[] args) {hanoi(5, 'A', 'B', 'C');}/*** @param n 共有N個(gè)盤子* @param from 開始的柱子* @param in 中間的柱子* @param to 目標(biāo)柱子 無論有多少個(gè)盤子,都認(rèn)為只有兩個(gè)。上面的所有盤子和最下面一個(gè)盤子。*/public static void hanoi(int n, char from, char in, char to) {// 只有一個(gè)盤子。if (n == 1) {System.out.println("第1個(gè)盤子從" + from + "移到" + to);// 無論有多少個(gè)盤子,都認(rèn)為只有兩個(gè)。上面的所有盤子和最下面一個(gè)盤子。} else {// 移動上面所有的盤子到中間位置hanoi(n - 1, from, to, in);System.out.println("第" + n + "個(gè)盤子從" + from + "移到" + to);// 移動下面的盤子// 把上面的所有盤子從中間位置移到目標(biāo)位置hanoi(n - 1, in, from, to);}}}蟹蟹觀看~~~
總結(jié)
以上是生活随笔為你收集整理的数据结构Java02【栈、队列、单链表(增删节点)、循环链表、双向循环链表、递归(斐波那契、汉诺塔)】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构Java01【数据结构概述、数组
- 下一篇: java美元兑换,(Java实现) 美元