摘要:概述前面說完了棧,接下來再看看另一種很基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),隊(duì)列。很明顯,隊(duì)列的操作也是受限的,插入元素入隊(duì)只能在隊(duì)尾,刪除元素出隊(duì)只能在隊(duì)頭。這時(shí)候我們需要進(jìn)行數(shù)據(jù)搬移,性能會受到影響,而循環(huán)隊(duì)列解決了這個(gè)問題。
1. 概述
前面說完了棧,接下來再看看另一種很基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),隊(duì)列。顧名思義,隊(duì)列跟我們現(xiàn)實(shí)生活中的排隊(duì)很相似:例如我們在食堂排隊(duì)打飯,先來的先打到,后來的只能一次排在后面,不允許插隊(duì)。很明顯,隊(duì)列的操作也是受限的,插入元素(入隊(duì))只能在隊(duì)尾,刪除元素(出隊(duì))只能在隊(duì)頭。結(jié)合下面的圖就很容易理解了:
2. 隊(duì)列實(shí)現(xiàn)
和棧一樣,隊(duì)列也有兩種實(shí)現(xiàn)方式,使用數(shù)組實(shí)現(xiàn)的隊(duì)列叫做順序隊(duì)列,使用鏈表實(shí)現(xiàn)的隊(duì)列叫做鏈?zhǔn)疥?duì)列。這里我實(shí)現(xiàn)了鏈?zhǔn)疥?duì)列,你也可以根據(jù)其思想使用數(shù)組來實(shí)現(xiàn)。
public class LinkedListQueue { private Node head;//隊(duì)頭節(jié)點(diǎn)指針 private Node tail;//隊(duì)尾節(jié)點(diǎn)指針 private int size;//隊(duì)列中元素個(gè)數(shù) public LinkedListQueue() { this.head = null; this.tail = null; this.size = 0; } //入隊(duì) public boolean enqueue(String value) { Node node = new Node(value); if(tail == null) { head = tail = node; this.size ++; return true; } tail.next = node; tail = node; this.size ++; return true; } //出隊(duì)列 public String dequeue() { if(head == null) return null;//隊(duì)列為空 String result = head.getData(); head = head.next; this.size --; return result; } //定義鏈表節(jié)點(diǎn) public static class Node{ private String data; private Node next; public Node(String data) { this.data = data; this.next = null; } public String getData() { return data; } } }
3. 循環(huán)隊(duì)列
在使用數(shù)組實(shí)現(xiàn)隊(duì)列的時(shí)候,會出現(xiàn)一個(gè)問題,就是隨著隊(duì)頭和隊(duì)尾指針的后移,就算數(shù)組中還有空間,也不能進(jìn)行入隊(duì)操作了。這時(shí)候我們需要進(jìn)行數(shù)據(jù)搬移,性能會受到影響,而循環(huán)隊(duì)列解決了這個(gè)問題。
循環(huán)隊(duì)列就是將數(shù)組首尾相連,形成了一個(gè)環(huán)形:
如上圖,當(dāng)指針 tail 到達(dá)數(shù)組末尾的時(shí)候,并不進(jìn)行數(shù)據(jù)搬移,而是直接將指針向前移,到達(dá)了 0 這個(gè)位置。在進(jìn)行一次入隊(duì),就變成了下面的樣子:
可以看到,循環(huán)隊(duì)列判斷空的條件是 head == tail,而怎么判斷隊(duì)列滿呢?答案是 (tail + 1)== head 的時(shí)候,隊(duì)列就滿了,不能看出循環(huán)隊(duì)列實(shí)際上浪費(fèi)了一個(gè)存儲空間。下面我給出了循環(huán)隊(duì)列的代碼實(shí)現(xiàn):
public class CircularQueue { private String[] items; private int size; private int head; private int tail; public CircularQueue(int capacity) { this.items = new String[capacity]; this.size = 0; this.head = 0; this.tail = 0; } public CircularQueue() { this(16); } //入隊(duì)列 public boolean enqueue(String value) { if((tail + 1) % items.length == head) return false;//隊(duì)列已滿 items[tail] = value; //head 和 tail 指針的移動不是簡單的加減1了 tail = (tail + 1) % items.length; this.size ++; return true; } //出隊(duì)列 public String dequeue() { if(head == tail) return null;//隊(duì)列為空 String result = items[head]; head = (head + 1) % items.length; this.size --; return result; } //隊(duì)列中元素個(gè)數(shù) public int size() { return size; } //打印隊(duì)列中數(shù)據(jù) public void print() { int h = head; int t = tail; while(h != t) { System.out.print(items[h] + " "); h = (h + 1) % items.length; } System.out.println(); } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73733.html
摘要:如果處理不得當(dāng),就會造成緩存污染問題。解決緩存污染的算法算法,英文名,字面意思就是最不經(jīng)常使用的淘汰掉算法,是通過數(shù)據(jù)被訪問的頻率來判斷一個(gè)數(shù)據(jù)的熱點(diǎn)情況。分析降低了緩存污染帶來的問題,命中率比要高。 微信公眾號:IT一刻鐘大型現(xiàn)實(shí)非嚴(yán)肅主義現(xiàn)場一刻鐘與你分享優(yōu)質(zhì)技術(shù)架構(gòu)與見聞,做一個(gè)有劇情的程序員關(guān)注可第一時(shí)間了解更多精彩內(nèi)容,定期有福利相送喲。 showImg(https://s...
摘要:于是翻出了機(jī)房里的這本學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法開始學(xué)習(xí)程序員的基礎(chǔ)知識。這本書用了我最熟悉的來實(shí)現(xiàn)各種數(shù)據(jù)結(jié)構(gòu)和算法,而且書很薄,可以說是一本不錯的入門教程。隊(duì)列在頭部刪除元素,尾部添加元素。 本系列所有文章:第一篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊(duì)列第二篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之字典和散列表第五篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算...
摘要:之?dāng)?shù)組操作接下來就是數(shù)據(jù)結(jié)構(gòu)的第一部分,棧。以字符串顯示棧中所有內(nèi)容方法的實(shí)現(xiàn)說明需要往棧中添加新元素,元素位置在隊(duì)列的末尾。的前端樂園原文鏈接寒假前端學(xué)習(xí)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法,棧與隊(duì)列 本系列的第一篇文章: 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(一),棧與隊(duì)列第二篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(二):鏈表第三篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(三):集合第...
摘要:與堆棧區(qū)別隊(duì)列的操作方式和堆棧類似,唯一的區(qū)別在于隊(duì)列只允許新數(shù)據(jù)在后端進(jìn)行添加。移除隊(duì)列的第一項(xiàng),并返回被移除的元素。三使用隊(duì)列計(jì)算斐波那契數(shù)列的第項(xiàng)。前兩項(xiàng)固定為,后面的項(xiàng)為前兩項(xiàng)之和,依次向后。 showImg(https://segmentfault.com/img/remote/1460000019005270); 這是第二周的練習(xí)題,這里補(bǔ)充下咯,五一節(jié)馬上就要到了,自己的...
摘要:前言數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時(shí)更新,歡迎各位讀者監(jiān)督。隊(duì)列和棧類似,也是一個(gè)遵循特殊規(guī)則約束的數(shù)據(jù)結(jié)構(gòu)。將沒有元素的隊(duì)列稱之為空隊(duì),往隊(duì)列中插入元素的過程稱之為入隊(duì),從隊(duì)列中移除元素的過程稱之為出隊(duì)。 聲明:碼字不易,轉(zhuǎn)載請注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時(shí)更新,歡迎各位讀者監(jiān)督。本文介紹數(shù)據(jù)結(jié)構(gòu)中的隊(duì)列(queue)的概念、存儲結(jié)構(gòu)、隊(duì)列的特點(diǎn)...
摘要:而且目前大部分編程語言的高級應(yīng)用都會用到數(shù)據(jù)結(jié)構(gòu)與算法以及設(shè)計(jì)模式。隊(duì)列在尾部添加新元素,并從頂部移除元素。最新添加的元素必須排在隊(duì)列的末尾。 前言 JavaScript是當(dāng)下最流行的編程語言之一,它可以做很多事情: 數(shù)據(jù)可視化(D3.js,Three.js,Chart.js); 移動端應(yīng)用(React Native,Weex,AppCan,Flutter,Hybrid App,小程...
閱讀 2419·2021-11-19 09:40
閱讀 3588·2021-10-12 10:12
閱讀 1897·2021-09-22 15:04
閱讀 2910·2021-09-02 09:53
閱讀 774·2019-08-29 11:03
閱讀 1130·2019-08-28 18:11
閱讀 1734·2019-08-23 15:28
閱讀 3588·2019-08-23 15:05