<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
迴圈佇列一般通過陣列實現。我們需要解決幾個問題。
a、下標最後再往後(offset 小於 array.length): index = (index + offset) % array.length。通俗一點,就是如果我們的陣列大小為8,下標走到了7,再往後如何回到0,我們可以(index+1)%8來實現。
b、下標最前再往前的時候,我們特殊判斷一下,將其置為陣列大小減一即可。
我們可以給陣列預留一個位置,如果rear+1=front,則表示佇列已滿;如果rear=front,表示佇列為空。這個情況下,我們需要考慮佇列大小的問題,在定義陣列大小時,需要比原有的大一。
【程式碼如下】
class MyCircularQueue { public int front; public int rear; public int[] array; //構造方法 public MyCircularQueue(int k) { //因為預留位置的緣故,陣列的大小要定義為k+1 this.array=new int[k+1]; } //入隊 public boolean enQueue(int value) { if(isFull()){ return false; } this.array[this.rear]=value; this.rear=(this.rear+1)%this.array.length; return true; } //出隊 public boolean deQueue() { if(isEmpty()){ return false; } this.front=(this.front+1)%this.array.length; return true; } //獲取隊頭 public int Front() { if(isEmpty()){ return -1; } return this.array[front]; } //獲取隊尾 public int Rear() { if(isEmpty()){ return -1; } int index=-1; if(this.rear==0){ index=this.array.length-1; }else{ index=this.rear-1; } return this.array[index]; } //判斷是否為空 public boolean isEmpty() { if(this.front==this.rear){ return true; } return false; } //判斷佇列是否滿 public boolean isFull() { if((this.rear+1)%this.array.length==this.front){ return true; } return false; } }
因為棧的先進後出、佇列的先進先出原則。我們需要兩個佇列來實現棧。當兩個佇列都為空時,棧為空。
【程式碼如下】
class MyStack { private Queue<Integer> queue1; private Queue<Integer> queue2; //構造方法 public MyStack() { queue1=new LinkedList<>(); queue2=new LinkedList<>(); } //入棧 public void push(int x) { if(!queue2.isEmpty()){ queue2.offer(x); }else{ queue1.offer(x); } } //出棧 public int pop() { if(empty()){ return -1; } if(queue1.isEmpty()){ int size=queue2.size(); for(int i=0;i<size-1;++i){ int x=queue2.poll(); queue1.offer(x); } return queue2.poll(); }else{ int size=queue1.size(); for(int i=0;i<size-1;++i){ int x=queue1.poll(); queue2.offer(x); } return queue1.poll(); } } //獲取棧頂元素 public int top() { if(empty()){ return -1; } if(queue1.isEmpty()){ int x=-1; int size=queue2.size(); for(int i=0;i<size;++i){ x=queue2.poll(); queue1.offer(x); } return x; }else{ int size=queue1.size(); int x=-1; for(int i=0;i<size;++i){ x=queue1.poll(); queue2.offer(x); } return x; } } //判斷棧是否為空 public boolean empty() { if(queue1.isEmpty()&&queue2.isEmpty()){ return true; } return false; } }
還是和上面一樣,需要用到兩個棧(stack1、stack2)。和實現棧列不同的是,入隊只能對同一個棧進行操作。如果兩個棧都為空,則佇列為空。
【程式碼如下】
class MyQueue { private Stack<Integer> stack1; private Stack<Integer> stack2; //構造方法 public MyQueue() { stack1=new Stack<>(); stack2=new Stack<>(); } //入隊操作 public void push(int x) { stack1.push(x); } //出隊操作 public int pop() { if(stack2.empty()){ int size=stack1.size(); for(int i=0;i<size;++i){ int x=stack1.pop(); stack2.push(x); } } return stack2.pop(); } //獲取佇列開頭的元素 public int peek() { if(stack2.empty()){ int size=stack1.size(); for(int i=0;i<size;++i){ int x=stack1.pop(); stack2.push(x); } } return stack2.peek(); } //判斷佇列是否為空 public boolean empty() { if(stack1.empty()&&stack2.empty()){ return true; } return false; } }
其實就是要在O(1)的時間複雜度內找到棧的最小元素。需要兩個棧來實現,一個棧來進行出棧、入棧操作。只需要保證不管如何操作,另一個棧的棧頂元素都是當前棧的最小元素即可。
兩個棧stack1、stack2,站的操作都在stack1中:
這樣就能保證stack2的棧頂元素總是stack1的最小元素。注意:如果stack1中入棧兩個相同的最小元素,都需要對stack2進行入棧。
【程式碼如下】
class MinStack { private Stack<Integer> stack1; private Stack<Integer> stack2; //構造方法 public MinStack() { stack1=new Stack<>(); stack2=new Stack<>(); } //入棧 public void push(int val) { stack1.push(val); if(stack2.empty()){ stack2.push(val); }else{ if(val<=stack2.peek()){ stack2.push(val); } } } //出棧 public void pop() { int x=stack1.pop(); if(x==stack2.peek()){ stack2.pop(); } } //獲取棧頂元素 public int top() { return stack1.peek(); } //獲取棧的最小元素 public int getMin() { return stack2.peek(); } }
到此這篇關於Java 棧與佇列實戰真題訓練的文章就介紹到這了,更多相關Java 棧與佇列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45