给定一个只包括 ‘(‘,‘)‘,‘{‘,‘}‘,‘[‘,‘]‘ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
方法一:
解题思路:
(1)初始化一个栈S
(2)遍历字符串的每一个括号
(3)如果当前字符是左括号,将该字符压入栈中,稍后处理;
(4)如果遇到右括号, 则检查栈定的元素,如果站定的元素是一个相同类型的左括号
那么就将他弹出,继续处理,否则就是无效的字符串
(5)在遍历结束之后,查看栈是否为空,如果不为空,则说明表达式无效。
代码实现:
//我在此处用链表来实现栈,因为我可以很简单使用头插法以及头部元素弹出来实现栈的先进后出的特性
struct Node {
char data;
struct Node * next;
};
//此处我使用了一个哨兵节点来对栈进行管理,哨兵节点的next域指向了栈顶
struct Node * sentinel=NULL;
void init_stack(){
//初始化栈
sentinel=malloc(sizeof(struct Node));
sentinel->data=‘\0‘;
sentinel->next=NULL;
}
void push(char c){
// 元素压栈
struct Node *ptr=NULL;
ptr=malloc(sizeof(struct Node));
ptr->a=c;
ptr->next=NULL;
if(!sentinel->next){
sentinel->next=ptr;
}else{
ptr->next=sentinel->next;
sentinel->next=ptr;
}
}
void pop(){
// 元素出栈
struct Node *ptr=NULL;
ptr=sentinel->next;
sentinel->next=ptr->next;
free(ptr);
}
void destroy(){
//销毁栈
while(sentinel->next != NULL){
pop();
}
}
bool isValid(char *s){
if(strlen(s) == 0){
return true;
}
init_stack();
while(*s!=‘\0‘){
if(*s == ‘(‘ || *s == ‘[‘ || *s == ‘{‘){
push(*s);
s++;
}else{
if(*s == ‘)‘
&& sentinel->next !=NULL
&& sentinel->next->a == ‘(‘)
{
pop();
s++;
}else if(*s == ‘]‘
&& sentinel->next !=NULL
&& sentinel->next->a == ‘[‘)
{
pop();
s++;
}else if(*s == ‘}‘
&& sentinel->next !=NULL
&& sentinel->next->a == ‘{‘)
{
pop();
s++;
}else {
return false;
}
}
}
if(sentinel->next !=NULL){
destroy();
return false;
}
return true;
}
注意, 这是C的代码,但是leetcode上的编译器是支持bool类型的,我在linux上编译测试的时候,是自己typedef int bool, 并define true 1, define false 0
这样提交会报错,所有我就都删除了。还有他默认是包含了struct ListNode 结构体的定义的,所以我就把我的结构体定义为了struct Node,避免冲突。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
原文:https://www.cnblogs.com/pigdragon/p/12451842.html