删除字符串中的所有相邻重复项--栈与队列

第一版的代码如下下:

点击查看代码
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的使用,前者两两交换元素的值,后者交换范围内的指定值。
posted @ 2024-11-17 11:49  小橘0815  阅读(12)  评论(0编辑  收藏  举报