问题
描述
牛牛拿到了一个字符串。
他每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串"abbc"点击后可以生成"ac"。
但相同而不相邻、不相同的相邻字母都是不可以被消除的。
牛牛想把字符串变得尽可能短。他想知道,当他点击了足够多次之后,字符串的最终形态是什么?
输入描述:
一个字符串,仅由小写字母组成。(字符串长度不大于300000)
输出描述:
一个字符串,为“点击消除”后的最终形态。若最终的字符串为空串,则输出0。
示例1
输入:abbc
输出:ac
示例2
输入:abba
输出:0
示例3
输入:bbbbb
输出:b
代码
#include <stdio.h>
#include <string.h>
struct stack {
int size;
int top;
char data[300001];
} stack;
void init(struct stack* sk) {
sk->top = 0;
sk->size = 0;
}
void push(struct stack* sk, char a) {
sk->data[sk->top] = a;
sk->size ++;
sk->top ++;
}
char top(struct stack* sk) {
return sk->data[sk->top - 1];
}
char pop(struct stack* sk) {
sk->size --;
sk->top --;
return sk->data[sk->top];
}
int main() {
char str[300001];
scanf("%s\n", str);
int len = strlen(str);
struct stack sk;
init(&sk);
for (int i = 0; i < len; i++) {
if (sk.size == 0) {
// printf("push %c\n", str[i]);
push(&sk, str[i]);
} else if (str[i] == top(&sk)) {
// printf("push %c\n", str[i]);
pop(&sk);
} else{
push(&sk, str[i]);
}
}
if (sk.size == 0) {
printf("0\n");
} else {
for (int i = 0; i < sk.top; i ++) {
printf("%c", sk.data[i]);
}
}
return 0;
}
思路
还是遍历,再判断字符是否等于栈顶,如果不等于或者栈为空就进栈,否则出栈