摘要:常見(jiàn)數(shù)據(jù)結(jié)構(gòu)分析及實(shí)現(xiàn)說(shuō)明本文中的代碼是參考編程思想某培訓(xùn)機(jī)構(gòu)。同時(shí)還要分析這些數(shù)據(jù)結(jié)構(gòu)在時(shí)間和空間上的開(kāi)銷(xiāo)。這種專(zhuān)門(mén)研究應(yīng)用程序中的數(shù)據(jù)之間的邏輯關(guān)系,存儲(chǔ)方式及其操作的學(xué)問(wèn)就是數(shù)據(jù)結(jié)構(gòu)。
常見(jiàn)數(shù)據(jù)結(jié)構(gòu)分析及實(shí)現(xiàn) 說(shuō)明
本文中的代碼是參考《Java編程思想》、某培訓(xùn)機(jī)構(gòu)。
文中的代碼放Github了,有興趣的可以看看,點(diǎn)歌star鼓勵(lì)下我。
代碼在Sublime中敲的,坑爹的GBK,注釋了很多中文,一轉(zhuǎn)碼不能用了?。?!
重點(diǎn)在思想,而不是實(shí)現(xiàn) 。再次推薦《Java編程思想》。
1、數(shù)據(jù)結(jié)構(gòu)
編程的本質(zhì)就是對(duì)數(shù)據(jù)(信息以數(shù)據(jù)的形式而存在)的處理,實(shí)際編程中不得不處理大量數(shù)據(jù),因此實(shí)際動(dòng)手編程之前必須先分析處理這些數(shù)據(jù),處理數(shù)據(jù)之間存在的關(guān)系。
現(xiàn)實(shí)的數(shù)據(jù)元素之間有個(gè)錯(cuò)綜復(fù)雜的邏輯關(guān)系,需要采用合適的物理結(jié)構(gòu)來(lái)存儲(chǔ)這些數(shù)據(jù),并以此為基礎(chǔ)對(duì)這些數(shù)據(jù)進(jìn)行相應(yīng)的操作。同時(shí)還要分析這些數(shù)據(jù)結(jié)構(gòu)在時(shí)間和空間上的開(kāi)銷(xiāo)。這種專(zhuān)門(mén)研究應(yīng)用程序中的數(shù)據(jù)之間的邏輯關(guān)系,存儲(chǔ)方式及其操作的學(xué)問(wèn)就是數(shù)據(jù)結(jié)構(gòu)。
數(shù)據(jù)元素之間存在的關(guān)聯(lián)關(guān)系被稱(chēng)為數(shù)據(jù)的邏輯結(jié)構(gòu),歸納起來(lái),大致有如下四種基本的邏輯結(jié)構(gòu):
集合:數(shù)據(jù)元素之間只有"同屬于一個(gè)集合"的關(guān)系
線(xiàn)性關(guān)系:數(shù)據(jù)元素之間存在一個(gè)對(duì)一個(gè)的關(guān)系
樹(shù)形結(jié)構(gòu):數(shù)據(jù)元素之間存在一個(gè)對(duì)多個(gè)的關(guān)系
圖狀結(jié)構(gòu)或網(wǎng)狀結(jié)構(gòu):數(shù)據(jù)元素之間存在多個(gè)對(duì)多個(gè)的關(guān)系。
腦補(bǔ)圖:
圖片>代碼>文字,個(gè)人理解,能用圖片說(shuō)明問(wèn)題的就不要用代碼,同理,盡量用代碼+文字解釋問(wèn)題的本質(zhì)。
同一種的邏輯結(jié)構(gòu),在底層通常有兩種物理存儲(chǔ)結(jié)構(gòu):
順序存儲(chǔ)結(jié)構(gòu),如一維數(shù)組
非順序存儲(chǔ)結(jié)構(gòu),如鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)(鏈表)、散列
順序結(jié)構(gòu)適合讀操作(為啥呢?因?yàn)橛兴饕?,鏈表存儲(chǔ)適合寫(xiě)操作(為啥呢?斷開(kāi),加上節(jié)點(diǎn)就完成,不需要底層復(fù)制啊)
算法的設(shè)計(jì)取決于邏輯結(jié)構(gòu):算法的實(shí)現(xiàn)依賴(lài)于存儲(chǔ)結(jié)構(gòu)。對(duì)象的設(shè)計(jì)取決于類(lèi)結(jié)構(gòu),(...)
什么是數(shù)據(jù)結(jié)果呢?數(shù)據(jù)結(jié)構(gòu)歸納起來(lái)所要研究的問(wèn)題就三方面:
數(shù)據(jù)元素之間的客觀(guān)聯(lián)系(邏輯結(jié)構(gòu))
數(shù)據(jù)在計(jì)算機(jī)內(nèi)部的存儲(chǔ)方式(存儲(chǔ)結(jié)構(gòu))
針對(duì)數(shù)據(jù)實(shí)施的有效的操作和處理(算法)
對(duì)象之間的關(guān)系(對(duì)現(xiàn)實(shí)的抽象,繼承?組合?),存儲(chǔ)在內(nèi)存中哪里,堆上啊,怎么存?存在數(shù)組里?hash表里?怎么處理的?。吭鰟h改查啊,排序那,加密解密啊,
Stack對(duì)于普通的線(xiàn)性表而言,它的作用是一個(gè)容器,用于裝具有相似結(jié)果的數(shù)據(jù)。
分為順序存儲(chǔ)機(jī)構(gòu)和鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)
可以進(jìn)行插入、刪除和排序的操作
如果線(xiàn)性表之允許在線(xiàn)性表的某端添加、刪除元素,這時(shí)就演變?yōu)椋簵:完?duì)列。(先進(jìn)后出(彈夾),先進(jìn)先出(火車(chē)站排隊(duì)))
以下圖片來(lái)自維基百科(百X百科就別看了)
原諒沒(méi)放恐怖的,來(lái)自Google(百X就別用了)
棧(Stack),是一種特殊的線(xiàn)性表,只能在固定的一端(線(xiàn)性表的尾端)進(jìn)行插入、刪除操作。
允許進(jìn)行插入、刪除操作的一端為棧頂(top),另一端,你猜?(bottom)
進(jìn)棧:將一個(gè)元素插入棧的過(guò)程,棧的長(zhǎng)度+1,(壓入子彈)
出棧:刪除一個(gè)元素的過(guò)程,棧的長(zhǎng)度-1.(彈出發(fā)射...)
先進(jìn)后出,或者說(shuō)后進(jìn)先出。
常用操作:初始化,(隨著棧幀的移除,方法在執(zhí)行??赡艹霈F(xiàn)https://stackoverflow.com/),++i,i++,
在Java中繼承關(guān)系,Stack繼承自Vector,List,(abstractList?)
需求:
請(qǐng)編寫(xiě)代碼實(shí)現(xiàn)Stack類(lèi),該類(lèi)能夠?qū)崿F(xiàn)后進(jìn)先出的堆棧功能,要求實(shí)現(xiàn)的方法包括:
Stack(int) 實(shí)例化指定深度的棧
boolean push(E item) 像棧頂壓入對(duì)象,成功返回true,棧已滿(mǎn)返回false
E pop() 從棧頂移除對(duì)象并返回,為空則返回null
E peek() 查看并返回棧頂?shù)膶?duì)象,為空返回null
int size() 返回棧中當(dāng)前元素?cái)?shù)量
int depth() 返回當(dāng)前堆棧深度
-
萬(wàn)惡的字符編碼,無(wú)比的郁悶以下所有代碼參考網(wǎng)絡(luò),在Sublime中編寫(xiě)。
基于單列表實(shí)現(xiàn):
class Node{ Node next = null; E data; public Node(E data) { this.data = data; } } //采用單鏈表實(shí)現(xiàn)棧 public class MyStack { int depth; //棧的深度 public MyStack(int i) { this.depth = i; } Node top = null; //將元素壓入棧中 public boolean push(E data) { if(size() < depth) { Node newNode = new Node (data); newNode.next = top; top = newNode; return true; } return false; } //讀取棧中的頭節(jié)點(diǎn),不刪除頭節(jié)點(diǎn) public E peek() { if(top ==null) { return null; } return top.data; } //獲取棧中的頭節(jié)點(diǎn),并刪除頭節(jié)點(diǎn) public E pop() { if(top ==null) { return null; } Node tmp = top; top = top.next; return tmp.data; } //棧的元素個(gè)數(shù) public int size() { int len = 0; Node tmeNode = top; while(tmeNode != null) { tmeNode = tmeNode.next; len++; } return len; } //當(dāng)前棧的深度 public int depth() { return this.depth; } public static void main(String[] args) { MyStack stack = new MyStack(2); System.out.println(stack.push(1)); System.out.println(stack.push(2)); System.out.println(stack.push(3)); System.out.println("棧的元素個(gè)數(shù): " +stack.size()); System.out.println(stack.pop()); System.out.println(stack.pop()); System.out.println(stack.pop()); System.out.println("棧的元素個(gè)數(shù): " + stack.depth()); } } ---------------------------此代碼來(lái)自《Java編程思想》---------------------------------- import java.util.LinkedList; public class Stack { private LinkedList storage = new LinkedList (); public void push(T v) { storage.addFirst(v); } public T peek() { return storage.getFirst(); } public T pop() { return storage.removeFirst(); } public boolean empty() { return storage.isEmpty(); } public String toString() { return storage.toString(); } }
在來(lái)看看大佬的另一種實(shí)現(xiàn),簡(jiǎn)單明了啊。
public class LinkedStackQueue{ private static class Node { U item; Node next; Node() { item = null; next =null; } Node(U item,Node next) { this.item = item; this.next = next; } boolean end() { return item == null && next == null; } } private Node top = new Node (); public void push(T item) { top = new Node (item,top); } public T pop() { T result = top.item; if (!top.end()) { top = top.next; } return result; } public static void main(String[] args) { LinkedStack lss = new LinkedStack (); for (String s : "Phasers on stun!".split(" ") ) lss.push(s); String s; while((s = lss.pop()) != null) System.out.println(s); } } 輸出如下: I:Java otesortcode>java LinkedStack stun! on Phasers
隊(duì)列(queue),也是一種特殊的線(xiàn)性表,使用固定的一端來(lái)插入數(shù)據(jù),另一端用于刪除數(shù)據(jù)
先進(jìn)先出,就像火車(chē)站排隊(duì)買(mǎi)票一樣?。?!,整個(gè)隊(duì)伍向前面移動(dòng)。
分為順序隊(duì)列結(jié)構(gòu)和鏈?zhǔn)疥?duì)列結(jié)構(gòu)
從JDK 5 開(kāi)始,Java集合框架提供了Queue接口,實(shí)現(xiàn)該接口的類(lèi)可以當(dāng)成隊(duì)列使用,如LinkedBlockingQueue,PriorityBlockingQueue。
可以通過(guò)輪詢(xún)和等待-通知機(jī)制實(shí)現(xiàn)阻塞隊(duì)列。
具體Queue實(shí)現(xiàn):
import java.util.*; public class SimpleQueueimplements Iterable { private LinkedList storage = new LinkedList (); public void add(T t){ storage.offer(t); } public T get() { return storage.poll(); } public Iterator iterator() { return storage.iterator(); } public static void main(String[] args) { SimpleQueue queue = new SimpleQueue(); queue.add(8); System.out.println(queue.get()); } }
我們?cè)趤?lái)看看用Stack如何實(shí)現(xiàn)Queue,非常不錯(cuò),《Java編程思想》
import java.util.Stack; public class MyQueue{ StackTreestack = new Stack (); Stack stackTmp = new Stack (); //Push element X to the back of queue public void push(int x) { stack.push(x); } //Removes the element form in front of queue public void pop() { if (stackTmp.isEmpty()) { while (!stack.isEmpty()) { int tmp = stack.peek(); stackTmp.push(tmp); stack.pop(); } } else { stackTmp.pop(); } } //Get the front element public int peek() { if (!stackTmp.isEmpty()) { int tmp = stack.peek(); stackTmp.push(tmp); } return stackTmp.peek(); } //Return whether the queueis empty public boolean empty() { if (stackTmp.isEmpty() && stack.isEmpty()) { return true; }else { return false; } } public static void main(String[] args) { MyQueue queue = new MyQueue(); queue.push(8); System.out.println(queue.empty()); //false } }
樹(shù),也是一種數(shù)據(jù)結(jié)構(gòu),非線(xiàn)性的,這種結(jié)構(gòu)內(nèi)的元素存在一對(duì)多的關(guān)系。
樹(shù),尤其是二叉樹(shù)應(yīng)用很廣泛,排序二叉樹(shù),平衡二叉樹(shù),紅黑樹(shù)。
二叉樹(shù),在普通的樹(shù)的基礎(chǔ)上,讓一顆樹(shù)中每個(gè)節(jié)點(diǎn)最多只能包含兩個(gè)子節(jié)點(diǎn),且嚴(yán)格區(qū)分左子節(jié)點(diǎn)和右子節(jié)點(diǎn)(位置不能變化)
-遍歷二叉樹(shù),考慮深讀,優(yōu)先遍歷。(先序遍歷、中序遍歷、后續(xù)遍歷)和廣度優(yōu)先遍歷。
哈夫曼樹(shù),一種帶權(quán)路徑最短的二叉樹(shù),在信息檢索中非常有用
哈夫曼編碼,假設(shè)需要對(duì)一個(gè)字符串如“abcabcabc”進(jìn)行編碼,將它轉(zhuǎn)化為唯一的二進(jìn)制碼,同時(shí)要求轉(zhuǎn)換出來(lái)的二進(jìn)制碼的長(zhǎng)度最小。可以采用哈夫曼樹(shù)來(lái)解決報(bào)文編碼問(wèn)題
排序二叉樹(shù):一種特殊的二叉樹(shù),可以非常方便的對(duì)樹(shù)中的所有節(jié)點(diǎn)進(jìn)行排序和檢索。
二叉樹(shù),這里采用遞歸和內(nèi)部類(lèi)的思想。
public class BinaryTree { private Node root; //添加節(jié)點(diǎn) public void add(int data) { if (root ==null) { root = new Node(data); }else { root.addNode(data); } } //打印節(jié)點(diǎn) public void print() { root.printNode(); } private class Node { private int data; private Node left; private Node right; public Node(int data) { this.data = data; } public void addNode(int data) { //核心思想就是進(jìn)來(lái)先個(gè)當(dāng)前節(jié)點(diǎn)比,如果如果小于則在左邊添加,如果左邊沒(méi)子節(jié)點(diǎn),則創(chuàng)建,如果有添加 if (this.data > data) { if (this.left == null) { this.left = new Node(data); }else { this.addNode(data); //這里應(yīng)該是采用遞歸。 } }else { if (this.right == null) { this.right = new Node(data); }else { this.right.addNode(data); } } } //中序遍歷 public void printNode() { if (this.left != null) { this.left.printNode(); } System.out.println(this.data + "->"); if (this.right !=null) { this.right.printNode(); } } } } ------------------------測(cè)試----------------------------------------------- public static void main(String[] args) { BinaryTree bt = new BinaryTree(); // 8、3、10、1、6、14、4、7、13 bt.add(8);bt.add(3);bt.add(10); bt.add(1);bt.add(6);bt.add(14); bt.add(4);bt.add(7);bt.add(13); bt.print(); } 輸出: 1->3->4->6->7->8->10->13->14->LinkedList
ArrayList因?yàn)閬y碼,寫(xiě)了一半,無(wú)奈啊,完全坑我,其思想就是根據(jù)索引,涉及到擴(kuò)容,判斷越界了么,。這里先不管了。直接看LinkedList。
public class MyLinkedList { protected Node first; // 鏈表的第一個(gè)節(jié)點(diǎn) protected Node last; // 鏈表的最后一個(gè)節(jié)點(diǎn) private int size; // 節(jié)點(diǎn)的數(shù)量 // 鏈表中的每一個(gè)節(jié)點(diǎn) public class Node { public Node(Object ele) { this.ele = ele; } Node prev; // 上一個(gè)節(jié)點(diǎn)對(duì)象 Node next; // 下一個(gè)節(jié)點(diǎn)對(duì)象 public Object ele; // 當(dāng)前節(jié)點(diǎn)中存儲(chǔ)的數(shù)據(jù) } public void addFirst(Object ele) { Node node = new Node(ele); //需要保存的節(jié)點(diǎn)對(duì)象 //進(jìn)來(lái)一個(gè)節(jié)點(diǎn),如果為空的話(huà),它可定時(shí)第一個(gè),也是最后一個(gè) if (size == 0) { this.first = node; this.last = node; }else { node.next = this.first; // 把之前第一個(gè)作為新增節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),(進(jìn)來(lái)一個(gè),當(dāng)前的只能當(dāng)老二了。) this.first.prev = node; // 把新增節(jié)點(diǎn)作為之前第一個(gè)節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn) this.first = node; // 把新增的節(jié)點(diǎn)作為第一個(gè)節(jié)點(diǎn) } size++; } //這里很重要,別忘記 public void addLast(Object ele) { Node node = new Node(ele); if (size == 0) { this.first = node; this.last = node; }else { this.last.next = node; // 新增節(jié)點(diǎn)作為之前最后一個(gè)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)(因?yàn)槭羌釉诤竺妫援?dāng)前節(jié)點(diǎn)的下一個(gè)才是 新增節(jié)點(diǎn)) node.prev = this.last; // 之前最后一個(gè)節(jié)點(diǎn)作為新增節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn) this.last = node; // 把新增的節(jié)點(diǎn)作為最后一個(gè)節(jié)點(diǎn) } } //原諒我復(fù)制了 public void remove(Object ele) { // 找到被刪除的節(jié)點(diǎn) Node current = this.first;// 確定為第一個(gè)節(jié)點(diǎn),從頭到尾開(kāi)始找 for (int i = 0; i < size; i++) { if (!current.ele.equals(ele)) {// 當(dāng)前為true !true 為false ,說(shuō)明找到當(dāng)前ele,輸出 if (current.next == null) { // 續(xù)上: 如果false取反為true, 判斷是否最后一個(gè), return; } current = current.next; } } //刪除節(jié)點(diǎn) if(current==first){ this.first = current.next; //當(dāng)前的下一個(gè)作為第一個(gè) this.first.prev = null; //當(dāng)前下一個(gè)對(duì)上一個(gè)的引用設(shè)置為null }else if(current==last){ this.last = current.prev; this.last.next = null; }else{ //把刪除當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)作為刪除節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn)的next current.prev.next =current.next; //把刪除節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn)作為刪除節(jié)點(diǎn)下一個(gè)節(jié)點(diǎn)的prev current.next.prev = current.prev; } size--; //System.out.println("current =" + current.ele); } public String toString() { if (size == 0) { return "[]"; } StringBuilder sb = new StringBuilder(size * 2 + 1); Node current = this.first;// 第一個(gè)節(jié)點(diǎn) sb.append("["); for (int i = 0; i < size; i++) { sb.append(current.ele); if (i != size - 1) { sb.append(","); } else { sb.append("]"); } current = current.next; // 獲取自己的下一個(gè)節(jié)點(diǎn) } return sb.toString(); } }
這個(gè)雙向列表有點(diǎn)難理解,還是看圖吧,
線(xiàn)性鏈表:
雙向鏈表:
先到這里吧,gogogo,機(jī)會(huì)是留給有準(zhǔn)備的人,
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/68685.html
摘要:完全二叉樹(shù)深度為有個(gè)結(jié)點(diǎn)的二叉樹(shù),其每個(gè)結(jié)點(diǎn)的編號(hào)與深度為的滿(mǎn)二叉樹(shù)中編號(hào)從的結(jié)點(diǎn)一一對(duì)應(yīng)葉子結(jié)點(diǎn)只可能在層數(shù)最大的兩層上出現(xiàn)。 二叉樹(shù)的性質(zhì) (1) 在二叉樹(shù)的第 i 層最多有 2^i-1 個(gè)結(jié)點(diǎn) (i>=1). (2) 深度為 k 的二叉樹(shù)最多有 2^k - 1 個(gè)結(jié)點(diǎn) (k>=1). (3) 對(duì)任何一棵二叉樹(shù),如果其葉子結(jié)點(diǎn)數(shù)為 n0, 度為 2 的結(jié)點(diǎn)數(shù)為 n2,...
摘要:序列文章面試之函數(shù)面試之對(duì)象面試之?dāng)?shù)組的幾個(gè)不操作面試之對(duì)比分析前言數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)組織數(shù)據(jù)的方式算法是系統(tǒng)描述解決問(wèn)題的策略。了解基本的數(shù)據(jù)結(jié)構(gòu)和算法可以提高代碼的性能和質(zhì)量。 showImg(https://segmentfault.com/img/bVbqYZQ?w=3000&h=2250); 序列文章 JS面試之函數(shù)(1)JS面試之對(duì)象(2)JS面試之?dāng)?shù)組的幾個(gè)不low操作...
摘要:棧迭代復(fù)雜度時(shí)間空間遞歸??臻g對(duì)于二叉樹(shù)思路用迭代法做深度優(yōu)先搜索的技巧就是使用一個(gè)顯式聲明的存儲(chǔ)遍歷到節(jié)點(diǎn),替代遞歸中的進(jìn)程棧,實(shí)際上空間復(fù)雜度還是一樣的。對(duì)于先序遍歷,我們出棧頂節(jié)點(diǎn),記錄它的值,然后將它的左右子節(jié)點(diǎn)入棧,以此類(lèi)推。 Binary Tree Preorder Traversal Given a binary tree, return the preorder tr...
摘要:樹(shù)和樹(shù)的算法一樹(shù)樹(shù)的概念樹(shù)英語(yǔ)是一種抽象數(shù)據(jù)類(lèi)型或是實(shí)作這種抽象數(shù)據(jù)類(lèi)型的數(shù)據(jù)結(jié)構(gòu),用來(lái)模擬具有樹(shù)狀結(jié)構(gòu)性質(zhì)的數(shù)據(jù)集合。一種時(shí)間復(fù)雜度額外空間復(fù)雜度的二叉樹(shù)的遍歷方式,為二叉樹(shù)的節(jié)點(diǎn)個(gè)數(shù)。 樹(shù)和樹(shù)的算法 一、樹(shù) 1.1 樹(shù)的概念 樹(shù)(英語(yǔ):tree)是一種抽象數(shù)據(jù)類(lèi)型(ADT)或是實(shí)作這種抽象數(shù)據(jù)類(lèi)型的數(shù)據(jù)結(jié)構(gòu),用來(lái)模擬具有樹(shù)狀結(jié)構(gòu)性質(zhì)的數(shù)據(jù)集合。它是由n(n>=1)個(gè)有限節(jié)點(diǎn)組成一個(gè)...
摘要:樹(shù)和樹(shù)的算法一樹(shù)樹(shù)的概念樹(shù)英語(yǔ)是一種抽象數(shù)據(jù)類(lèi)型或是實(shí)作這種抽象數(shù)據(jù)類(lèi)型的數(shù)據(jù)結(jié)構(gòu),用來(lái)模擬具有樹(shù)狀結(jié)構(gòu)性質(zhì)的數(shù)據(jù)集合。一種時(shí)間復(fù)雜度額外空間復(fù)雜度的二叉樹(shù)的遍歷方式,為二叉樹(shù)的節(jié)點(diǎn)個(gè)數(shù)。 樹(shù)和樹(shù)的算法 一、樹(shù) 1.1 樹(shù)的概念 樹(shù)(英語(yǔ):tree)是一種抽象數(shù)據(jù)類(lèi)型(ADT)或是實(shí)作這種抽象數(shù)據(jù)類(lèi)型的數(shù)據(jù)結(jié)構(gòu),用來(lái)模擬具有樹(shù)狀結(jié)構(gòu)性質(zhì)的數(shù)據(jù)集合。它是由n(n>=1)個(gè)有限節(jié)點(diǎn)組成一個(gè)...
閱讀 3075·2021-11-23 09:51
閱讀 2922·2021-11-11 16:55
閱讀 3027·2021-10-14 09:43
閱讀 1463·2021-09-23 11:22
閱讀 1103·2019-08-30 11:04
閱讀 1789·2019-08-29 11:10
閱讀 1023·2019-08-27 10:56
閱讀 3213·2019-08-26 12:01