順序佇列模板簡單應用演算法設計:解碼(為何會陷入無限死迴圈?)
問題描述 :
-
目的:使用C++模板設計順序佇列的抽象資料型別(ADT)。並在此基礎上,使用順序佇列ADT的基本操作,設計並實現簡單應用的演算法設計。
-
內容:(1)請參照順序棧的ADT模板,設計順序佇列的抽象資料型別。(由於該環境目前僅支援單檔案的編譯,故將所有內容都集中在一個原始檔內。在實際的設計中,推薦將抽象類及對應的派生類分別放在單獨的標頭檔案中。參考教材、課件,以及網盤中的順序棧ADT原型檔案,自行設計順序佇列的ADT。)
-
(2)ADT的簡單應用:使用該ADT設計並實現若干應用順序佇列的演算法設計。
-
應用:假設某國特工收到一串事先經過加密處理的密碼數字(每位數字的範圍為0-9),要求按照預先設定的規則將其解碼,恢復到原始的狀態,方可使用。解碼規則如下:首先將第1位數刪除,緊接著將第2位數放到這串數的末尾,再將第3位數刪除,再將第4位數放到這串數的末尾,再將第5位數刪除……直到剩下最後一位數,將最後一位數也刪除。最後,按照剛才刪除的順序,把所有這些刪除的數,按照刪除的順序重新連在一起就是原始的密碼數字。
-
例如:給定的一串數字是“631758924”, 經過解碼處理後,得到原始的密碼數字為“615947283”。接收到的數字串內如存在空格,空格不計入位數。
-
要求設計一個演算法,使用順序佇列,設計並實現按照以上規則進行解碼的演算法。為簡單起見,解碼結果直接輸出即可,無需儲存。
參考函式原型:
template<class ElemType>
void decode(SqQueue<ElemType> &S, string &code);
輸入說明 :
第一行:待解碼的亂碼數字(數字串之間可以有空格,不影響解碼結果)
輸出說明 :
第一行:解碼後的原始密碼
輸入範例 :
6 317 5 8924
輸出範例 :
615947283
思路分析
偽碼實現
void decode(SqQueue &S, string &code)
{
for(int i = 0;i < code.size();i ++)
{
if(code.at(i) != ' '){
S.enQueue(code.at(i));
}
}
while(!S.QueueisEmpty())
{
S.deQueue(temp);
result.push_back(temp);
//請仔細看這步,為你不加判定會死迴圈
if(S.deQueue(temp))S.enQueue(temp);
}
}
事故現場
第一次提交
- 雖然一遍過了,但是在提交之前發現了我的會陷入無限的死迴圈,因為自己又犯了那個不那麼常見的毛病,沒有對出棧的值進行清空
- temp即使棧為空了,temp讀取失敗了,但是temp的值並不為空,我原先是直接將temp壓入棧中的,需要提前進行一下判定。
分析總結
- 很多東西都是瞭解的不透,細節不夠全面
- 關於string.at()返回的是char型,不是string型,應該和單引號的內容進行比較
- 關於string的append,只能在後面新增string型別的變數,不能新增char型,應該使用push_back();
- 題目很簡單,但是著實做的有點費
若有不妥,或者疑惑,請加本人扣扣651378276,一同商量學習,謝謝支援轉發
相關文章
- 順序迴圈佇列的介面設計佇列
- 無限for迴圈(死迴圈)
- 佇列的順序儲存--迴圈佇列的建立佇列
- 棧,佇列,優先順序佇列簡單介面使用佇列
- Android程式設計師會遇到的演算法(part 6 優先順序佇列PriorityQueue)Android程式設計師演算法佇列
- node事件迴圈和訊息佇列簡單分析事件佇列
- 佇列 和 迴圈佇列佇列
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- 佇列-順序儲存佇列
- LeetCode 迴圈佇列LeetCode佇列
- LeetCode題解:641. 設計迴圈雙端佇列,使用佇列,JavaScript,詳細註釋LeetCode佇列JavaScript
- redis訊息佇列簡單應用Redis佇列
- 【資料結構】佇列(順序佇列、鏈佇列)的JAVA程式碼實現資料結構佇列Java
- 最簡單的C程式設計--順序程式設計C程式程式設計
- 【小白學演算法】3. 迴圈佇列演算法佇列
- 程式流程 (順序,選擇,迴圈)
- 封裝優先順序佇列封裝佇列
- 佇列 手算到機算 入門 佇列 迴圈佇列佇列
- 《演算法筆記二》連結串列、棧、佇列、遞迴、雜湊表、順序表演算法筆記佇列遞迴
- 佇列的一種實現:迴圈佇列佇列
- 刷題系列 - 合併兩個順序佇列為一個新的佇列佇列
- Java版-資料結構-佇列(迴圈佇列)Java資料結構佇列
- 佇列順序性引發的思考佇列
- 自定義單連結串列佇列的基本介面函式(非迴圈佇列)佇列函式
- Rust 程式設計,實現簡單的佇列Rust程式設計佇列
- 事件迴圈與任務佇列事件佇列
- 迴圈佇列C++實現佇列C++
- thinkphp where in order 按照順序in的迴圈排序PHP排序
- 靜態佇列,迴圈陣列實現佇列陣列
- Linkedlist的應用場景:設計佇列、設計棧佇列
- Java 迴圈&選擇 if&for 簡單應用 指定輸出Java
- Java優先順序佇列DelayedWorkQueue原理分析Java佇列
- 簡單的演算法-解決頁面指令碼非同步載入順序問題演算法指令碼非同步
- 詳解JavaScript的任務、微任務、佇列以及程式碼執行順序JavaScript佇列
- 簡單的 for 迴圈也會踩的坑
- Android程式設計師面試會遇到的演算法(part 4 訊息佇列的應用)Android程式設計師面試演算法佇列
- 手擼MQ訊息佇列——迴圈陣列MQ佇列陣列
- Throwing cards away I(queue迴圈佇列)佇列