第一版的代码如下下:
点击查看代码
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;
}
};