刪除字串中的所有相鄰重複項--棧與佇列

小橘0815發表於2024-11-17

第一版的程式碼如下下:

點選檢視程式碼
class Solution
{
public:
    string removeDuplicates(string s)
    {
        stack<char> str;
        for (int i = 0; i < s.size(); i++)
        {
            //要先判斷才能進行壓棧,再次記住棧一定要先判斷是否為空
            if (str.empty() || s[i] != str.top())
            {
                str.push(s[i]);
            }else
            {
                str.pop();
            }
        }
        string t = "";
        /*在 while 迴圈中,您嘗試透過 t[j] 的方式來給字串 t 賦值。
        但是,這樣的方式會導致字串 t 的長度不斷增加,並且超出了原先的
        長度。這會導致訪問超出字串 t 的範圍,產生未定義的行為。正確的
        做法是使用 push_back() 方法將字元逐個新增到字串末尾。
        /*int j = 0;
        while (!str.empty())
        {
            t[j] = str.top();
            str.pop();
            j++;
            在 C++ 中,字串物件是一個動態分配的字元陣列,它的大小可以動態增長以容納新的字元。
        }*/
        while (!str.empty()) { // 將棧中元素放到result字串彙總
            t += str.top();
            str.pop();
        }
        reverse(t.begin(),t.end());
        return t;
    }
};
然後是第二次的記錄
點選檢視程式碼
class Solution {
public:
    string removeDuplicates(string s) {
        //先壓進去然後看開頭和將要壓進去的是否一樣,然後迴圈
        //最終剩下的再出棧就是最終的字串
        int size = s.size();
        stack<char> myStack;
        for(int i = 0;i < size; i++){
            if(!myStack.empty()){
                if(myStack.top() == s[i]){
                    myStack.pop();
                    continue;
                }
            }
            myStack.push(s[i]);
        }
        string result;
        while(!myStack.empty()){
            result += myStack.top();
            myStack.pop();
        }//注意棧是先進後出的這個順序是反的
        reverse(result.begin(), result.end());
        return result;
    }
};
感覺第二次寫的比第一次更加簡單,注意一下swap和reverse的使用,前者兩兩交換元素的值,後者交換範圍內的指定值。

相關文章