生活如果真能像隊列一樣的話

生活如果真能像隊列一樣,那該多好啊。
——————————————————————————————————————————

背包,隊列

可以先看他們的API:都含有一個無參構造函數,添加單個元素的方法,測試集合是否為空的方法和返回集合大小的方法。而Stack和Queue有能刪除集合的特定元素的方法。

它們具有泛型迭代的特性。

泛型的使用,可以用它們存儲任意類型的數據。
如:Stack , 用Item替換任意數據類型

Stack<String> stack = new Stack<String>();

而類型參數必須被實例化為引用類型。而java具有自動裝箱和自動拆箱的機制,可以在引用類型和對應的原始數據類型之間轉換。

Stack<Integer> stack = new Stack<Integer>();
stack.push(17);  //自動裝箱 (int 轉換為 Integer)
int i = stack.pop(); //自動拆箱 (Integer 轉換為 int)

如果集合可迭代,可以使用如foreach循環來逐個訪問集合中的元素,無需手動管理索引或遍歷位置,這樣可以簡化代碼實現。

Queue<String> queue = new LinkedList<>();
// 使用 foreach 循環來遍歷 Queue
for (String element : queue) {System.out.println(element);
}

背包

特點:

  • 支持刪除元素和遍歷操作
  • 收集元素并迭代遍歷所有收集到的元素
  • 迭代的順序不確定(無序)且與用例無關
  • 主要用于統計計算,去重,求平均值或者樣本標準差之類的場景

就理解成一個背包即可,里面各種球,一次放進去一個球,或者一次從里面找自己想要的具有某種特點的球。

Bag<Double> numbers = new Bag<Double>();
while (!StdIn.isEpty()) numbers.add(StdIn.readDouble());
int N = number.size(); // 背包的元素數量double sum = 0.0
for (double x : number)sum += x;
double mean = sum/N;sum = 0.0;
for(double x : number)sum += (x - mean)*(x- mean);
double std = Math.sqrt(sum/(N-1));

隊列(queue)

先進先出隊列是一種基于先進先出(FIFO) 策略的集合類型。

使用場景很常見,尤其是排隊,打印機等待打印或者是計算機某些軟件等待處理的任務。

因為是服務性的策略,所以主打一個公平,先到先得,等的越久越先服務。

Queue<Integer> queue = new Queue<Integer>();
// Enqueue 操作  可以通過add()或offer()方法實現
queue.add("A");
queue.add("B");
queue.offer("C");// dequeue:從隊列的頭部移除并返回一個元素,可以使用remove()或poll()方法來實現
String dequeuedElement = queue.remove();
System.out.println("Dequeued element: " + dequeuedElement);

隊列是一個有序列表,可以用數組或是鏈表來實現。

數組模擬隊列思路

  • 隊列本身是有序列表,若使用數組的結構來存儲隊列的數據,則隊列數組的聲明如下圖, 其中 maxSize 是該隊 列的最大容量。
  • 因為隊列的輸出、輸入是分別從前后端來處理,因此需要兩個變量 front 及 rear 分別記錄隊列前后端的下標, front 會隨著數據輸出而改變,而 rear 則是隨著數據輸入而改變,如圖所示:

在這里插入圖片描述

準備工作思路:

  1. 將front和rear初始化為-1 , 為了表示隊列為空的狀態 (當隊列中添加第一個元素時,front和rear都會更新為0,表示隊列中有一個元素)

  2. 當 front == rear 則代表隊列為空

  3. 當 rear == maxSize - 1 則代表隊列為滿

class ArrayQueue {
private int maxSize; // 表示數組的最大容量
private int front; // 隊列頭
private int rear; // 隊列尾
private int[] arr; // 該數據用于存放數據, 模擬隊列// 創建隊列的構造器
public ArrayQueue(int arrMaxSize) {maxSize = arrMaxSize;arr = new int[maxSize];front = -1; // 指向隊列頭部,分析出 front 是指向隊列頭的前一個位置.rear = -1; // 指向隊列尾,指向隊列尾的數據(即就是隊列最后一個數據)
}// 判斷隊列是否滿   (隊列尾指向數組的最大索引)
public boolean isFull() {return rear == maxSize - 1;
}// 判斷隊列是否為空   (初始時,兩指針都為-1,指向同一個位置)
public boolean isEmpty() {return rear == front;
}

存入數據思路分析

1.添加元素時,判斷隊列是不是滿的。若不是,則頭指針不動,用于元素出隊列,將尾指針后移:rear+1

2.再將數據存入 rear 所指的數組元素中

// 添加數據到隊列
public void addQueue(int n) {
// 判斷隊列是否滿if (isFull()) {System.out.println("隊列滿,不能加入數據~");return;}rear++; // 讓 rear 后移arr[rear] = n;
}

出隊列(獲取隊列的數據)代碼

public int getQueue() {
// 判斷隊列是否空if (isEmpty()) {// 通過拋出異常throw new RuntimeException("隊列空,不能取數據");}front++; // front 后移 滿足先進先出原則。return arr[front];
}

顯示隊列中的所有數據 代碼:

public void showQueue() {// 遍歷if (isEmpty()) {System.out.println("隊列空的,沒有數據~~");return;}for (int i = 0; i < arr.length; i++) {System.out.printf("arr[%d]=%d\n", i, arr[i]);}
}

顯示隊列的頭數據 代碼:

public int headQueue() {if (isEmpty()) {throw new RuntimeException("隊列空的,沒有數據~~");}return arr[front + 1];}
}

對于這個代碼所模擬的隊列進行問題分析及方案優化:

  • 問題:目前數組使用一次就不能用,沒有出隊列的功能,則沒有達到復用的效果。且如果隊列尾部的空間已滿,而隊列頭部仍有空間,此時無法再添加元素
  • 優化方案:將這個數組使用算法,改進成一個環形的隊列 通過取模(%)變成循環

數組模擬環形隊列

? 對前面的數組模擬隊列進行優化,實現可以復用。成為是一個環形的循環隊列。(通過取模的方式來實現即可)

分析說明:

  1. 因為是環形結構,滿了會回頭。所以當尾索引的下一個為頭索引時,表示隊列滿了。因此將隊列容量空出一個作為約定。通過這個約定可以得出, (rear + 1) % maxSize == front,代表隊列滿了。

  2. rear == front 則代表隊列為空

    當你定義了1個長度為5的隊列,已經有了4個元素。這個時候頭指針指著第一個數字,尾指針值向

    具體思路如下:

    1. 將front指向隊列的第一個元素,即front=0

    2. 將rear指向隊列最后一個元素的后一個位置,即rear=0。(這里需要注意,rear指向的位置實際上是不存儲數據的,只是為了區分隊列空和滿的情況,因此需要浪費一個位置

      在這里插入圖片描述

        這里比如當你定義了1個長度為5的隊列,已經有了4個元素。這個時候頭指針指著第一個元素,尾指針值向第4個元素后面的位置。這時候你再加一個元素的話,那尾指針就指回了第一個位置,這樣子就出現了rear == front。那你就沒辦法確定到底是隊列滿了還是隊列空了。因此采用(rear + 1) % maxSize == front就表示隊列滿了,此時rear指向的位置實際上是不存儲數據的。
      
      • 在網上找到的其他思路:新增一個容量 capacity 字段,并進行維護,當 capacity=size 表示隊列已滿。維護一個標記,或者當 頭指針=尾指針 時同步判斷當前位置是否有元素來判斷當前是隊空還是隊滿。
        
      • 	現在使用的方法會浪費一個空間;而新增容量字段需要維護,而標記的方法隊列空和隊列滿的時候需要判斷是那種情況,影響性能。一般使用浪費一個空間的方法,用空間換時間。
        
    3. 在判斷隊列是否滿時,尾指針的下一個位置會等于頭指針的位置。所以使用**(rear + 1) % maxSize == front**條件,當rear和front相鄰且都指向有數據的位置時,隊列為滿。

      public boolean isFull() {return (rear + 1) % maxSize == front;
      }
    4. 在判斷隊列是否為時,使用rear == front的條件,當隊列中沒有元素時,front和rear都指向同一個位置。

      public boolean isEmpty() {return rear == front;
      }
      
    5. 計算隊列中有效數據元素的個數時,使用**(rear + maxSize - front) % maxSize**的公式,由于隊列是循環的,所以隊列的尾部可能在數組的起始位置之前。

      計算出隊列尾指針rear到隊列頭指針front的距離,并進行模運算,得到實際的元素個數。

添加數據到隊列

public void addQueue(int n) {// 判斷隊列是否滿if (isFull()) {System.out.println("隊列滿,不能加入數據~");return;}//直接將數據加入arr[rear] = n;//將 rear 后移, 這里必須考慮取模!rear = (rear + 1) % maxSize;
}

獲取隊列的數據, 出隊列

public int getQueue() {// 判斷隊列是否空if (isEmpty()) {// 通過拋出異常throw new RuntimeException("隊列空,不能取數據");}// 這里需要分析出 front 是指向隊列的第一個元素// 1. 先把 front 對應的值保留到一個臨時變量// 2. 然后將 front 后移, 考慮取模!// 3. 將臨時保存的變量返回int value = arr[front];front = (front + 1) % maxSize;  return value;
}

顯示隊列的所有數據

public void showQueue() {// 遍歷if (isEmpty()) {System.out.println("隊列空的,沒有數據~~");return;}for (int i = front; i < front + size() ; i++) {// 使用 i % maxSize 的目的是確保索引值在循環隊列的有效范圍內
//假設隊列的最大大小為 5,且隊列起始位置front是2,不取模的話,那就超出了隊列范圍,應該回到隊列的開頭,則需要取模。System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize])}
}// 求出當前隊列有效數據的個數
public int size() {// rear = 2// front = 1// maxSize = 3return (rear + maxSize - front) % maxSize;
}

顯示隊列的頭數據

public int headQueue() {// 判斷if (isEmpty()) {throw new RuntimeException("隊列空的,沒有數據~~");}return arr[front];}
}

————————————————————————————————————
那這樣子是不是就有機會了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160645.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160645.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160645.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php項目從寶塔面板切換轉到phpstudy小皮面板

寶塔面板轉phpstudy面板 版本 寶塔面板8.0.1 phpstudy面板8.1.1.3 步驟 1、寶塔面板,找到項目文件夾,打包、下載到本地、解壓 2、本地windows系統安裝phpstudy面板,選擇盡可能一樣的配置 比如寶塔php7.4.33,可能phpstudy面板只有php7.4.3,也行 大環境一定要一致,比如…

力扣算法練習BM46—最小的K個數

題目 給定一個長度為 n 的可能有重復值的數組&#xff0c;找出其中不去重的最小的 k 個數。例如數組元素是4,5,1,6,2,7,3,8這8個數字&#xff0c;則最小的4個數字是1,2,3,4(任意順序皆可)。 數據范圍&#xff1a;0≤k,n≤10000&#xff0c;數組中每個數的大小0≤val≤1000 要…

linux signal 機制

ref&#xff1a; Linux操作系統學習筆記&#xff08;十六&#xff09;進程間通信之信號 | Ty-Chens Home https://www.cnblogs.com/renxinyuan/p/3867593.html 當執行kill -9 PID時系統發生了什么 -

Codeforces Round 910 (Div. 2) D. Absolute Beauty

D. Absolute Beauty 有兩個長度為 n n n 的整數數組 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1?,a2?,…,an? 和 b 1 , b 2 , … , b n b_1,b_2,\ldots,b_n b1?,b2?,…,bn? 。他將數組 b b b 的美麗值定義為 ∑ i 1 n ∣ a i ? b i ∣ . \sum_{i1}^{n} |a_i - b…

基于材料生成算法優化概率神經網絡PNN的分類預測 - 附代碼

基于材料生成算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于材料生成算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于材料生成優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要&#xff1a;針對PNN神…

JDK命令使用總結

目錄 javacjava javac 將源碼(*.java)編譯成字節碼(*.class) javac HelloWorld.javajava 運行字節碼(*.class) 不能加后綴名 java HelloWorld直接運行單文件源碼(*.java) Java11以上才支持 java HelloWorld.java

ROSNS3(一)

https://github.com/malintha/rosns3 第一步&#xff1a;clone和構建rosns3客戶端 第二步&#xff1a;運行 最詳細的ubuntu 安裝 docker教程 - 知乎 1. unable to find source space /home/muta/src 解決方法&#xff1a; 將副將將碰到的bug&#xff0c;解決方法_#include &…

【C++ Primer Plus學習記錄】遞增運算符(++)和遞減運算符(--)

遞增運算符&#xff08;&#xff09;和遞減運算符&#xff08;--&#xff09;&#xff1a;前綴版本位于操作數前面&#xff0c;如x&#xff1b;后綴版本位于操作數后面&#xff0c;如x。兩個版本對操作數的影響是一樣的&#xff0c;但是影響的時間不同。這就像吃飯前買單和吃飯…

Python從零開始快速搭建一個語音對話機器人

文章目錄 01-初心緣由02-準備工作03-語音機器人的搭建思路04-語音生成音頻文件05-音頻文件轉文字STT06-與圖靈機器人對話07-文字轉語音08-語音對話機器人的完整代碼09-結束語10-有問必答關于Python技術儲備一、Python所有方向的學習路線二、Python基礎學習視頻三、精品Python學…

SSH連接遠程服務器報錯:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 解決方法

一.錯誤描述 報錯信息里提示了路徑信息/root/.ssh/known_hosts:20 二.解決方案 方法一 輸入以下指令&#xff1a; ssh-keygen -R XXX&#xff08;需要連接遠程服務器的ip&#xff09; 按照我的例子ip:10.165.7.136&#xff0c;會返回以下信息: 重新嘗試連接&#xff1a; 輸…

C++學習 --set

目錄 1&#xff0c; 什么是set 2&#xff0c; 創建set 2-1&#xff0c; 標準數據類型 2-2&#xff0c; 自定義數據類型 2-3&#xff0c; 其他創建方式 3&#xff0c; 操作set 3-1&#xff0c; 賦值 3-2&#xff0c; 添加元素&#xff08;insert&#xff09; 3-2-1&…

MySQL的樂觀鎖和悲觀鎖

1、樂觀鎖&#xff1a; 樂觀鎖在操作數據的時候&#xff0c;是保持一種樂觀的狀態&#xff0c;認為別的線程是不會同時修改數據的&#xff0c;所以是不會上鎖的&#xff0c;但是在更新的時候&#xff0c;會判斷一下在這個期間內是否有別的線程修改過數據。 主要的流程&#x…

規劃類3d全景線上云展館幫助企業輕松拓展海外市場

科技3D線上云展館作為一種基于VR虛擬現實和互聯網技術的新一代展覽平臺。可以在線上虛擬空間中模擬真實的展館&#xff0c;讓觀眾無需親自到場&#xff0c;即可獲得沉浸式的參觀體驗。通過這個展館&#xff0c;您可以充分、全面、立體展示您的產品、服務以及各種創意作品&#…

python運算符重載之成員關系和屬性運算

1 python運算符重載之成員關系和屬性運算 1.1 重載成員關系運算符 1.1.1 contains,iter,getitem python使用成員關系運算符in時&#xff0c; 按優先級調用方法&#xff1a;contains>iter>getitem&#xff1b; class MyIters:def __init__(self,value):self.datavalu…

2023年【安全生產監管人員】考試題及安全生產監管人員找解析

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 安全生產監管人員考試題參考答案及安全生產監管人員考試試題解析是安全生產模擬考試一點通題庫老師及安全生產監管人員操作證已考過的學員匯總&#xff0c;相對有效幫助安全生產監管人員找解析學員順利通過考試。 1、…

【樹莓派】Camera Module 使用

工具 RPI4RPI Camera Module 2 硬件安裝 直接插到板子的相機帶子插口上即可 使用前提 libcamera-hello運行這個命令能夠成功&#xff0c;否則需要裝相應的包 在 RPI4 上測試 libcamera-jpeg -o 00001.jpg -t 2000 --width 640 --height 480t 表示程序運行&#xff08;預…

SA8255 Q+A android 登錄QNX

需要工具busybox 130|gen4_gvm:/ # cd /data/ gen4_gvm:/data # ./busybox telnet 192.168.1.1Entering character mode Escape character is ^].QNX Neutrino (localhost) (ttyp0)login: root No home directory. Logging in with home "/". # 用戶名&#xff1a…

數據結構-棧的實現

1.棧的概念及結構 棧&#xff1a;一種特殊的線性表&#xff0c;其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂&#xff0c;另一端稱為棧底。棧中的數據元素遵守后進先出LIFO&#xff08;Last In First Out&#xff09;的原則。 壓棧&…

Matlab群體智能優化算法之海象優化算法(WO)

文章目錄 一、靈感來源二、算法的初始化三、GTO的數學模型Phase1&#xff1a;危險信號和安全信號Phase2&#xff1a;遷移&#xff08;探索&#xff09;Phase3&#xff1a;繁殖&#xff08;開發&#xff09; 四、流程圖五、偽代碼六、算法復雜度七、WO搜索示意圖八、實驗分析和結…