您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關怎么分析Java數據結構中的棧與隊列,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
在我們軟件應用 ,棧這種后進先出數據結構的應用是非常普遍的。比如你用瀏 覽器上網時不管什么瀏覽器都有 個"后退"鍵,你點擊后可以接訪問順序的逆序加載瀏覽過的網頁。
很多類似的軟件,比如 Word Photoshop 等文檔或圖像編 軟件中 都有撤銷 )的操作,也是用棧這種方式來實現的,當然不同的軟件具體實現會有很大差異,不過原理其實都是一樣的。
棧( stack )是限定僅在表尾進行插入和刪除的線性表
棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧 頂,另一端稱為棧底。棧中的數據元素遵守后進先出LIFO(Last In First Out)的原則。
壓棧:棧的插入操作叫做進棧/壓棧/入棧,入數據在棧頂。
出棧:棧的刪除操作叫做出棧。出數據在棧頂。
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); }
public class MyStack<T> { private T[] elem;//數組 private int top;//當前可以存放數據元素的下標-》棧頂指針 public MyStack() { this.elem = (T[])new Object[10]; } /** * 入棧操作 * @param item 入棧的元素 */ public void push(T item) { //1、判斷當前棧是否是滿的 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()); }
像移動、聯通、電信等客服電話,客服人員與客戶相比總是少數,在所有的客服人員都占線的情況下,客戶會被要求等待,直到有某個客服人員空下來,才能讓最先等待的客戶接通電話。這里也是將所有當前撥打客服電話的客戶進行了排隊處理。
操作系統和客服系統中,都是應用了種數據結構來實現剛才提到的先進先出的排隊功能,這就是隊列。
隊列(queue) 是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表
隊列:只允許在一端進行插入數據操作,在另一端進行刪除數據操作的特殊線性表,隊列具有先進先出FIFO(First In First Out) 入隊列:進行插入操作的一端稱為隊尾(Tail/Rear) 出隊列:進行刪除操作的一端稱為隊頭 (Head/Front)
public static void main(String[] args) { Deque<Integer> queue = new LinkedList<>(); queue.offer(1); queue.offer(2); queue.offer(3); queue.offer(4); }
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()); }
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()); }
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; //入隊 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; } } //出隊 public int poll() { //1判斷是否為空的 if(isEmpty()) { throw new UnsupportedOperationException("隊列為空!"); } //this.first = this.first.next; int ret = this.first.getVal(); this.first = this.first.getNext(); return ret; } //得到隊頭元素但是不刪除 public int peek() { //不要移動first if(isEmpty()) { throw new UnsupportedOperationException("隊列為空!"); } return this.first.getVal(); } //隊列是否為空 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()); }
看完上述內容,你們對怎么分析Java數據結構中的棧與隊列有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。