char *S=malloc(sizeof(char)* (n+1));//建立栈 int top=0; S[top-1];top--; S[top++];
C语言中无法直接使用栈,要先开空间,然后按照逻辑进行运用
思路:括号匹配是「栈」的经典应用。具体做法如下:
1.先判断一下字符串的长度是否为偶数。
#因为括号是成对出现的,所以字符串的长度应为偶数,可以直接判断长度为奇数的字符串不匹配。
如果字符串长度为奇数,则说明字符串中的括号不匹配,直接返回 F。
2.使用栈S 来保存未匹配的左括号。然后依次遍历字符串中的每一个字符。
如果遍历到左括号时,将其入栈。
如果遍历到右括号时,先看栈顶元素是否是与当前右括号相同类型的左括号。
如果是与当前右括号相同类型的左括号,则令其出栈,继续向前遍历。
如果不是与当前右括号相同类型的左括号,则说明字符串中的括号不匹配,直接返回 F。
3.遍历完,还要再判断一下栈是否为空。
如果栈为空,则说明字符串 中的括号匹配,返回 T。
如果栈不为空,则说明字符串 中的括号不匹配,返回 F
char pairs(char a){
if(a=='}') return '{';
if(a==']') return '[';
if(a==')') return '(';
return 0;
}
bool isValid(char* s) {
int n=strlen(s);
if(n%2==1)
return false;
int stk[n+1],top=0;
for(int i=0;i<n;i++){
char ch=pairs(s[i]);
if(ch){
if(top==0||stk[top-1]!=ch) return false;
top--;}
else stk[top++]=s[i];
}
return top==0;
}
给出由小写字母组成的字符串 S
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
读题目意思发现需要删除的相同元素,其实就是回文的数列。所以使用栈结构。
另外,题目要求返回一个字符串,所以最后要加上 S[top]='\0';
char* removeDuplicates(char* s) {
//当前项和栈顶一致,弹出栈顶抵消即可。若不一致,压入栈留存,供后续使用。
int n=strlen(s);
char *S=malloc(sizeof(char)* (n+1));//建立栈
int top=0;
for(int i=0;i<n;i++){
if(top>0&&S[top-1]==s[i]) top--;
else S[top++]=s[i];
}
S[top]='\0';
return S;
}