前言
- 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。
- 个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 牛客数据结构题目位置如下:
问题描述:
牛牛拿到了一个字符串。
他每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串"abbc"点击后可以生成"ac"。
但相同而不相邻、不相同的相邻字母都是不可以被消除的。
牛牛想把字符串变得尽可能短。他想知道,当他点击了足够多次之后,字符串的最终形态是什么?
输入描述:
一个字符串,仅由小写字母组成。(字符串长度不大于300000)
输出描述:
一个字符串,为“点击消除”后的最终形态。若最终的字符串为空串,则输出0。
举例:
//输入:
abbc
//输出:
ac
//输入:
abba
//输出:
0
//输入:
bbbbb
//输出:
b
解法思路:
- 作为一个匹配消除的题,类似于括号匹配的题目,显然可以使用数据结构栈来完成。上章使用了结构体实现栈,因此这章本着雨露均沾的原则,则按上章所说,使用数组来完成。
- 上一章节:【牛客刷题专栏】0x04:C数据结构栈实现逆波兰表达式求值及其重点讲解
代码结果:
#include <stdio.h>
#include <string.h>
int main()
{
char chars[300000]={0};
int topIdx=0;
int i=0;
scanf("%s",chars);
int len=strlen(chars);
char str[300000]={0};
while(i<len)
{
str[topIdx++]=chars[i++];
if(topIdx>1)
if(str[topIdx-1]==str[topIdx-2])
{
topIdx-=2;
}
}
if(topIdx==0)
printf("0");
else
{
i=0;
while(i<topIdx)
printf("%c",str[i++]);
return 0;
}
}
重点难点:
- 错误示范:
//错误示范:
#include <stdio.h>
#include <string.h>
int main() {
char chars[300000]={0};
int topIdx=0;
int i=0;
scanf("%s",chars);
int len=strlen(chars);
char str[300000]={0};
while(i<len)
{
str[topIdx++]=chars[i++];
if(str[topIdx-1]==chars[i])
{
topIdx--;
i++;
}
}
i=0;
if(topIdx==0)
printf("0");
else
while(i<topIdx)
printf("%c",str[i++]);
return 0;
}
- 如上,该解法每次使用入栈的变量与未入栈的变量比较。
- 若相等时,i++,跳过该未入栈的变量至下一个变量,看似没有问题,但需要注意,到达下一个变量后则进行下一次循环,将该变量入栈了,也就是说,遍历时并没有比较该变量与之前入栈的变量是否相等。
- 故遇见上述输入,则会漏掉没有消除完。总结来看,程序不够完备,造成了错误。
- 而这也是在利用栈完成此类题目时,出于尽可能少入栈的想法时,容易犯的错误。
结束语
- 以上就是C数据结构栈实现点击消除及其重点讲解的内容。可以在牛客尝试刷几道单链表题目来练习实践。牛客网刷题(点击可以跳转),可以尝试注册使用。