Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列的詳解
一,棧
1,概念
在我們軟件應(yīng)用 ,棧這種后進(jìn)先出數(shù)據(jù)結(jié)構(gòu)的應(yīng)用是非常普遍的。比如你用瀏 覽器上網(wǎng)時(shí)不管什么瀏覽器都有 個(gè)"后退"鍵,你點(diǎn)擊后可以接訪問順序的逆序加載瀏覽過的網(wǎng)頁。
很多類似的軟件,比如 Word Photoshop 等文檔或圖像編 軟件中 都有撤銷 )的操作,也是用棧這種方式來實(shí)現(xiàn)的,當(dāng)然不同的軟件具體實(shí)現(xiàn)會有很大差異,不過原理其實(shí)都是一樣的。
棧( stack )是限定僅在表尾進(jìn)行插入和刪除的線性表
棧:一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作。進(jìn)行數(shù)據(jù)插入和刪除操作的一端稱為棧 頂,另一端稱為棧底。棧中的數(shù)據(jù)元素遵守后進(jìn)先出LIFO(Last In First Out)的原則。
2,棧的操作
壓棧:棧的插入操作叫做進(jìn)棧/壓棧/入棧,入數(shù)據(jù)在棧頂。
出棧:棧的刪除操作叫做出棧。出數(shù)據(jù)在棧頂。
3,棧的實(shí)現(xiàn)
①入棧
public static void main(String[] args) { Stack<Integer> stack = new Stack<>(); stack.push(1); stack.push(2); stack.push(3); stack.push(4); int ret = stack.push(4); System.out.println(ret); }
②出棧
public static void main(String[] args) { Stack<Integer> stack = new Stack<>(); stack.push(1); stack.push(2); stack.push(3); int ret1 = stack.pop(); int ret2 = stack.pop(); System.out.println(ret1); System.out.println(ret2); }
③獲取棧頂元素
public static void main(String[] args) { Stack<Integer> stack = new Stack<>(); stack.push(1); stack.push(2); stack.push(3); int ret1 = stack.pop(); int ret2 = stack.pop(); int ret3 = stack.peek(); System.out.println(ret1); System.out.println(ret2); System.out.println(ret3); }
④判斷棧是否為空
public static void main(String[] args) { Stack<Integer> stack = new Stack<>(); stack.push(1); stack.push(2); stack.push(3); int ret1 = stack.pop(); int ret2 = stack.pop(); int ret3 = stack.peek(); System.out.println(ret1); System.out.println(ret2); System.out.println(ret3); stack.pop(); boolean flag = stack.empty(); System.out.println(flag); }
4,實(shí)現(xiàn)mystack
public class MyStack<T> { private T[] elem;//數(shù)組 private int top;//當(dāng)前可以存放數(shù)據(jù)元素的下標(biāo)-》棧頂指針 public MyStack() { this.elem = (T[])new Object[10]; } /** * 入棧操作 * @param item 入棧的元素 */ public void push(T item) { //1、判斷當(dāng)前棧是否是滿的 if(isFull()){ this.elem = Arrays.copyOf(this.elem,2*this.elem.length); } //2、elem[top] = item top++; this.elem[this.top++] = item; } public boolean isFull(){ return this.elem.length == this.top; } /** * 出棧 * @return 出棧的元素 */ public T pop() { if(empty()) { throw new UnsupportedOperationException("棧為空!"); } T ret = this.elem[this.top-1]; this.top--;//真正的改變了top的值 return ret; } /** * 得到棧頂元素,但是不刪除 * @return */ public T peek() { if(empty()) { throw new UnsupportedOperationException("棧為空!"); } //this.top--;//真正的改變了top的值 return this.elem[this.top-1]; } public boolean empty(){ return this.top == 0; } }
public static void main(String[] args) { MyStack<Integer> myStack = new MyStack<>(); myStack.push(1); myStack.push(2); myStack.push(3); System.out.println(myStack.peek()); System.out.println(myStack.pop()); System.out.println(myStack.pop()); System.out.println(myStack.pop()); System.out.println(myStack.empty()); System.out.println("============================"); MyStack<String> myStack2 = new MyStack<>(); myStack2.push("hello"); myStack2.push("word"); myStack2.push("thank"); System.out.println(myStack2.peek()); System.out.println(myStack2.pop()); System.out.println(myStack2.pop()); System.out.println(myStack2.pop()); System.out.println(myStack2.empty()); }
二,隊(duì)列
1,概念
像移動(dòng)、聯(lián)通、電信等客服電話,客服人員與客戶相比總是少數(shù),在所有的客服人員都占線的情況下,客戶會被要求等待,直到有某個(gè)客服人員空下來,才能讓最先等待的客戶接通電話。這里也是將所有當(dāng)前撥打客服電話的客戶進(jìn)行了排隊(duì)處理。
操作系統(tǒng)和客服系統(tǒng)中,都是應(yīng)用了種數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)剛才提到的先進(jìn)先出的排隊(duì)功能,這就是隊(duì)列。
隊(duì)列(queue) 是只允許在一端進(jìn)行插入操作,而在另一端進(jìn)行刪除操作的線性表
隊(duì)列:只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出FIFO(First In First Out) 入隊(duì)列:進(jìn)行插入操作的一端稱為隊(duì)尾(Tail/Rear) 出隊(duì)列:進(jìn)行刪除操作的一端稱為隊(duì)頭 (Head/Front)
2,隊(duì)列的實(shí)現(xiàn)
①入隊(duì)
public static void main(String[] args) { Deque<Integer> queue = new LinkedList<>(); queue.offer(1); queue.offer(2); queue.offer(3); queue.offer(4); }
②出隊(duì)
public static void main(String[] args) { Deque<Integer> queue = new LinkedList<>(); queue.offer(1); queue.offer(2); queue.offer(3); queue.offer(4); System.out.println(queue.poll()); System.out.println(queue.poll()); }
③獲取隊(duì)首元素
public static void main(String[] args) { Deque<Integer> queue = new LinkedList<>(); queue.offer(1); queue.offer(2); queue.offer(3); queue.offer(4); System.out.println(queue.poll()); System.out.println(queue.poll()); System.out.println("-----------------"); System.out.println(queue.peek()); }
3,實(shí)現(xiàn)myqueue
class Node { private int val; private Node next; public int getVal() { return val; } public void setVal(int val) { this.val = val; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } public Node(int val) { this.val = val; } } public class MyQueue { private Node first; private Node last; //入隊(duì) public void offer(int val) { //尾插法 需要判斷是不是第一次插入 Node node = new Node(val); if(this.first == null) { this.first = node; this.last = node; }else { this.last.setNext(node);//last.next = node; this.last = node; } } //出隊(duì) public int poll() { //1判斷是否為空的 if(isEmpty()) { throw new UnsupportedOperationException("隊(duì)列為空!"); } //this.first = this.first.next; int ret = this.first.getVal(); this.first = this.first.getNext(); return ret; } //得到隊(duì)頭元素但是不刪除 public int peek() { //不要移動(dòng)first if(isEmpty()) { throw new UnsupportedOperationException("隊(duì)列為空!"); } return this.first.getVal(); } //隊(duì)列是否為空 public boolean isEmpty() { return this.first == null; } }
public static void main(String[] args) { MyQueue myQueue = new MyQueue(); myQueue.offer(1); myQueue.offer(2); myQueue.offer(3); System.out.println(myQueue.peek()); System.out.println(myQueue.poll()); System.out.println(myQueue.poll()); System.out.println(myQueue.poll()); System.out.println(myQueue.isEmpty()); }
到此這篇關(guān)于Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列的詳解的文章就介紹到這了,更多相關(guān)Java 棧與隊(duì)列 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java 數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列
- java 數(shù)據(jù)結(jié)構(gòu)中棧和隊(duì)列的實(shí)例詳解
- Java 棧和隊(duì)列的相互轉(zhuǎn)換詳解
- Java棧和基礎(chǔ)隊(duì)列的實(shí)現(xiàn)詳解
- 一起來學(xué)習(xí)Java的棧和隊(duì)列
- Java?棧與隊(duì)列實(shí)戰(zhàn)真題訓(xùn)練
- Java 棧與隊(duì)列超詳細(xì)分析講解
- Java使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)隊(duì)列和棧流程詳解
- Java線性結(jié)構(gòu)中棧、隊(duì)列和串的基本概念和特點(diǎn)詳解
- Java常見的數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列詳解
- Java 棧和隊(duì)列的交互實(shí)現(xiàn)
相關(guān)文章
Python實(shí)現(xiàn)filter函數(shù)實(shí)現(xiàn)字符串切分
這篇文章主要介紹了Python實(shí)現(xiàn)filter函數(shù)實(shí)現(xiàn)字符串切分,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03mybatis3中@SelectProvider傳遞參數(shù)方式
這篇文章主要介紹了mybatis3中@SelectProvider傳遞參數(shù)方式。具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08SpringBoot中快速實(shí)現(xiàn)郵箱發(fā)送代碼解析
這篇文章主要介紹了SpringBoot中快速實(shí)現(xiàn)郵箱發(fā)送代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08java 反射getClass .class 的使用方法示例
這篇文章主要介紹了java 反射getClass .class 的使用方法,結(jié)合實(shí)例形式分析了java類反射機(jī)制的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11java實(shí)現(xiàn)Spring在XML配置java類的方法
下面小編就為大家?guī)硪黄猨ava實(shí)現(xiàn)Spring在XML配置java類的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11Java 圖片復(fù)制功能實(shí)現(xiàn)過程解析
這篇文章主要介紹了Java 圖片復(fù)制功能實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10用intellij Idea加載eclipse的maven項(xiàng)目全流程(圖文)
這篇文章主要介紹了用intellij Idea加載eclipse的maven項(xiàng)目全流程(圖文),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12