棧和隊列沒想象中那麼難

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"一、前言","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"之前已經講過鏈表了,它跟數組都是線性結構的基礎,本文主要講解線性結構的應用:","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"棧","attrs":{}},{"type":"text","text":"和","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"隊列","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果寫錯的地方希望大家能夠多多體諒並指正哦,如果有更好的理解的方式也希望能夠在評論下留言,讓大家學習學習~","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"二、數據結構【棧】就是這麼簡單","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"2.1數據結構【棧】介紹","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"數據結構的棧長的是這個樣子:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/03/0383afe5c0467f3a66c4bc7c8b488f8a.jpeg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其實非常好理解,我們將棧可以","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"看成一個箱子","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"往箱子裏面放東西叫做入棧","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"往箱子裏面取東西叫做出棧","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"箱子的底部叫做棧底","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"箱子的頂部叫做棧頂","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"說到棧的特性,肯定會有一句經典的言語來概括:","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"先進後出(LIFO, Last In First Out)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"往箱子裏邊放蘋果,箱子底部的蘋果想要拿出來,得先把箱子頂部的蘋果取走纔行","attrs":{}}]}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"2.2數據結構【棧】 代碼實現","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"棧的分類有兩種:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"靜態棧(數組實現)","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"動態棧(鏈表實現)","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從上一篇寫鏈表我就認知到我的算法是有多渣了,普通的單鏈表操作也能把我繞得暈暈的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由於我的鏈表還不是很熟,棧又不是很難,那麼我就用鏈表來創建動態棧了!","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"既然是用鏈表,我們還是把上一篇節點的代碼拿過來吧:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\npublic class Node {\n\n //數據域\n public int data;\n\n //指針域,指向下一個節點\n public Node next;\n\n public Node() {\n }\n\n public Node(int data) {\n this.data = data;\n }\n\n public Node(int data, Node next) {\n this.data = data;\n this.next = next;\n }\n\n}\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"要鏈表用來表示棧,這次會有兩個指針:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"棧頂","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"棧底","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\npublic class Stack {\n\n public Node stackTop;\n public Node stackBottom;\n\n public Stack(Node stackTop, Node stackBottom) {\n this.stackTop = stackTop;\n this.stackBottom = stackBottom;\n }\n\n public Stack() {\n }\n\n}\n","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2.2.1進棧","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"將原本棧頂指向的節點交由新節點來指向,棧頂指向新加入的節點","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n /**\n * 進棧\n *\n * @param stack 棧\n * @param value 要進棧的元素\n */\n public static void pushStack(Stack stack, int value) {\n\n // 封裝數據成節點\n Node newNode = new Node(value);\n\n // 棧頂本來指向的節點交由新節點來指向\n newNode.next = stack.stackTop;\n\n // 棧頂指針指向新節點\n stack.stackTop = newNode;\n\n }\n","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2.2.2遍歷棧","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"只要棧頂元素的指針不指向棧底","attrs":{}},{"type":"text","text":",那麼就一直輸出遍歷結果:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n /**\n * 遍歷棧(只要棧頂指針不指向棧底指針,就一直輸出)\n *\n * @param stack\n */\n public static void traverse(Stack stack) {\n Node stackTop = stack.stackTop;\n\n while (stackTop != stack.stackBottom) {\n\n System.out.println(\"關注公衆號:Java3y:\" + stackTop.data);\n\n stackTop = stackTop.next;\n }\n\n }\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"測試:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n public static void main(String[] args) {\n\n //初始化棧(無元素)\n Stack stack = new Stack(new Node(), new Node());\n\n //棧頂和棧尾是同一指向\n stack.stackBottom = stack.stackTop;\n\n //指向null\n stack.stackTop.next = null;\n\n //進棧\n pushStack(stack, 3);\n pushStack(stack, 4);\n pushStack(stack, 5);\n\n traverse(stack);\n\n }\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"結果:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/58/58a3980504c399f35a85a4af3e5214f6.jpeg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這就符合了先進後出的特性了~","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2.2.3判斷該棧是否爲空","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"很簡單,只要棧頂和棧底是同一指向,那麼該棧就爲空","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n /**\n * 判斷該棧是否爲空\n *\n * @param stack\n */\n public static void isEmpty(Stack stack) {\n if (stack.stackTop == stack.stackBottom) {\n\n System.out.println(\"關注公衆號:Java3y---->該棧爲空\");\n } else {\n\n System.out.println(\"關注公衆號:Java3y---->該棧不爲空\");\n\n }\n\n }\n","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2.2.4出棧","attrs":{}}]},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"在出棧之前看看該棧是否爲空,不爲空纔出棧...","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"將棧頂的元素的指針(指向下一個節點)賦值給棧頂指針(完成出棧)","attrs":{}}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":" /**\n * 出棧(將棧頂的指針指向下一個節點)\n * @param stack\n */\n public static void popStack(Stack stack) {\n\n // 棧不爲空才能出棧\n if (!isEmpty(stack)) {\n\n //棧頂元素\n Node top = stack.stackTop;\n\n // 棧頂指針指向下一個節點\n stack.stackTop = top.next;\n\n System.out.println(\"關注公衆號:Java3y---->出棧的元素是:\" + top.data);\n\n }\n }\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"測試出棧:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/e5/e58fab67ef321702d526810b7342df53.jpeg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"多次出棧:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/42/428eef38b3c5d32707df29eb9c641fff.jpeg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2.2.5清空棧","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當時學C的時候需要釋放內存資源,可是Java不用呀,所以棧頂指向棧底,就清空棧了","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n /**\n * 清空棧\n * @param stack\n */\n public static void clearStack(Stack stack) {\n\n stack.stackTop = null;\n stack.stackBottom = stack.stackTop;\n }\n","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"三、數據結構【隊列】就是這麼簡單","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"數據結構的隊列長的是這個樣子:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/0b/0b966e29695863278a1202895cd71a7d.jpeg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其實隊列非常好理解,我們將隊列可以","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"看成小朋友排隊","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"隊尾的小朋友到指定的地點了-->出隊","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有新的小朋友加入了-->入隊","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"相對於棧而言,隊列的特性是:先進先出","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"先排隊的小朋友肯定能先打到飯!","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"隊列也分成兩種:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"靜態隊列(數組實現)","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"動態隊列(鏈表實現)","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這次我就使用數組來實現靜態隊列了。值得注意的是:","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"往往實現靜態隊列,我們都是做成循環隊列","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/94/9463f4569577a122e5ec4472df4edf7b.jpeg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"做成循環隊列的","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"好處是不浪費內存資源","attrs":{}},{"type":"text","text":"!","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"3.1數據結構【隊列】 代碼實現","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這次我們使用的是數組來實現靜態隊列,因此我們可以這樣設計:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\npublic class Queue {\n\n //數組\n public int [] arrays;\n\n //指向第一個有效的元素\n public int front;\n\n //指向有效數據的下一個元素(即指向無效的數據)\n public int rear;\n\n}\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從上面的設計我們可以發現:","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"rear並不指向最後一個有效的元素,在循環隊列中這樣設計是非常方便的","attrs":{}},{"type":"text","text":"!因爲這樣設計可以","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"讓我們分得清隊頭和隊尾","attrs":{}},{"type":"text","text":"(不然循環隊列不斷入隊或出隊,位置是變化很快的)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由於我們是循環隊列,所以","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"front","attrs":{}}],"attrs":{}},{"type":"text","text":"和","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"rear","attrs":{}}],"attrs":{}},{"type":"text","text":"值會經常變動,我們得把","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"front","attrs":{}}],"attrs":{}},{"type":"text","text":"和","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"rear","attrs":{}}],"attrs":{}},{"type":"text","text":"的值限定在一個範圍內,不然會超出隊列的長度的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有這麼一個算法:","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"rear=(rear+1)%數組長度","attrs":{}}],"attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"比如rear的下標是2,數組的長度是6,往後面移一位是3,那麼","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"rear = (rear+1) % 6","attrs":{}}],"attrs":{}},{"type":"text","text":",結果還是3","attrs":{}}]}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"3.1.2初始化隊列","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"此時隊列爲空,分配了6個長度給數組(只能裝5個實際的數字,rear指向的是無效的位置的)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n public static void main(String[] args) {\n\n //初始化隊列\n Queue queue = new Queue();\n\n queue.front = 0;\n queue.rear = 0;\n queue.arrays = new int[6];\n\n }\n","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"3.1.3判斷隊列是否滿了","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果rear指針和front指針緊挨着,那麼說明隊列就滿了","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n /**\n * 判斷隊列是否滿了,front和rear指針緊挨着,就是滿了\n * @param queue\n * @return\n */\n public static boolean isFull(Queue queue) {\n if ((queue.rear + 1) % queue.arrays.length == queue.front) {\n\n System.out.println(\"關注公衆號:Java3y--->此時隊列滿了!\");\n return true;\n } else {\n System.out.println(\"關注公衆號:Java3y--->此時隊列沒滿了!\");\n return false;\n }\n }\n","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"3.1.4入隊","attrs":{}}]},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"判斷該隊列是否滿了","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"入隊的值插入到隊尾中(具體的位置就是rear指針的位置【再次聲明:rear指向的是無效元素的位置】","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":3,"align":null,"origin":null},"content":[{"type":"text","text":"rear指針移動(再次指向無效的元素位置)","attrs":{}}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n /**\n * 入隊\n *\n * @param queue\n */\n public static void enQueue(Queue queue,int value) {\n\n // 不是滿的隊列才能入隊\n if (!isFull(queue)) {\n\n // 將新的元素插入到隊尾中\n queue.arrays[queue.rear] = value;\n\n // rear節點移動到新的無效元素位置上\n queue.rear = (queue.rear + 1) % queue.arrays.length;\n }\n }\n","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"3.1.5遍歷","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"只要front節點不指向rear節點,那麼就可以一直輸出","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n /**\n * 遍歷隊列\n * @param queue\n *\n */\n public static void traverseQueue(Queue queue) {\n\n // front的位置\n int i = queue.front;\n\n while (i != queue.rear) {\n\n System.out.println(\"關注公衆號:Java3y--->\" + queue.arrays[i]);\n\n //移動front\n i = (i + 1) % queue.arrays.length;\n }\n\n }\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"隊列沒滿時:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/db/db7b300461540c9ab2050f41f343353e.jpeg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"隊列已滿了就插入不了了(驗證上面的方法是否正確):","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/ef/efb83469473cfe9ca24c622217a04337.jpeg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"3.1.6判斷該隊列是否爲空","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"只要","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"rear","attrs":{}}],"attrs":{}},{"type":"text","text":"和","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"front","attrs":{}}],"attrs":{}},{"type":"text","text":"指針指向同一個位置,那該隊列就是空的了","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n /**\n * 判斷隊列是否空,front和rear指針相等,就是空了\n * @param queue\n * @return\n */\n public static boolean isEmpty(Queue queue) {\n if (queue.rear == queue.front) {\n System.out.println(\"關注公衆號:Java3y--->此時隊列空的!\");\n return true;\n } else {\n System.out.println(\"關注公衆號:Java3y--->此時隊列非空!\");\n return false;\n }\n }\n","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"3.1.7出隊","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"出隊的邏輯也非常簡單:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"判斷該隊列是否爲null","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"如果不爲null,則出隊,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"只要front指針往後面移就是出隊了","attrs":{}},{"type":"text","text":"!","attrs":{}}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n /**\n * 出隊\n *\n * @param queue\n */\n public static void outQueue(Queue queue) {\n\n //判斷該隊列是否爲null\n if (!isEmpty(queue)) {\n\n //不爲空纔出隊\n int value = queue.arrays[queue.front];\n System.out.println(\"關注公衆號:Java3y--->出隊的元素是:\" + value);\n\n // front指針往後面移\n queue.front = (queue.front + 1) % queue.arrays.length;\n\n }\n\n }\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"結果:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/ea/ea2facd2713bc36e9eddfa47febdc1ba.jpeg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"四、總結","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"數據結構的棧和隊列的應用非常非常的多,這裏也只是最簡單的入門,理解起來也不困難。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"棧:先進後出","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"隊列:先進先出","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"關於數據結構這方面我就到暫時到這裏爲止了,都簡單的入個門,以後遇到更加複雜的再繼續開新的文章來寫~畢竟現在水平不夠,也無法理解更深層次的東西~數據結構這東西是必備的,等到研究集合的時候還會來回顧它,或者遇到新的、複雜的也會繼續學習....","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"想要更加深入數據結構的同學就得去翻閱相關的書籍咯~這僅僅是冰山一角","attrs":{}}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章