順序佇列模板簡單應用演算法設計:解碼(為何會陷入無限死迴圈?)

我想找一個女朋友!!發表於2020-11-21

問題描述 :

  • 目的:使用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,一同商量學習,謝謝支援轉發

相關文章