本题来自leetcode 20. valid Parentheses
一、问题描述
给定一个只包含字符'(',')','{','}','['和']'的字符串,确定输入字符串是有效的。
括号必须以正确的顺序关闭,“()”和“()[]”全部有效,但“(]”和“([)]”不是。
二、解题思路关键点
遍历字符串,将未匹配'(','{','['的压栈,匹配的出栈,
当栈底为')'、'}'、']'或者遍历完栈非空,则返回false,其余情况返回true
三、算法代码
1、栈数据结构定义
#define MAXSIZE 10000 #define OVERFLOW 0 #define error -65530 /**栈的数据结构定义**/ typedef struct Sq_stack { char data[MAXSIZE]; int top; }Sq_stack; /**栈的创建--初始化**/ void initStack(Sq_stack *S) { S = (Sq_stack*)malloc(sizeof(Sq_stack)); if(!S) exit(OVERFLOW);//栈空间分配失败 strcpy(S->data,""); S->top = 0; //栈顶元素从0开始算起 } /**插入栈顶元素e**/ bool Push(Sq_stack *S, char e) { /**插入栈顶元素:判断栈是否已满**/ if( S->top == MAXSIZE-1 ) return false; S->top++; S->data[S->top] = e; return true; } /**删除栈顶元素**/ void Pop(Sq_stack *S) { /**删除栈顶元素:判断栈是否为空**/ if(S->top == 0) return; S->top--; } bool isEmptyStack( Sq_stack *S ) { return S->top == 0?true:false; }
2、主算法部分
/********************************************* Author:tmw date:2018-5-5 *********************************************/ #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> bool isValid( char *s ) { /**算法入口:检查s**/ if( strlen(s) == 0 ) return true; /**申请栈并初始化**/ Sq_stack *stk = (Sq_stack*)malloc(sizeof(Sq_stack)); initStack(stk); /**进栈规则定义**/ int i = 0; for( i=0; i<strlen(s); i++ ) { /**当前栈为空,并且即将入栈的元素是右侧符号元素,则直接返回false**/ if( isEmptyStack(stk) && ( s[i]==')'||s[i]=='}'||s[i]==']') ) return false; /**其他情况--正常压栈前判断top元素**/ switch( s[i] ) { case ')': if( stk->data[stk->top] != '(' ) return false; else Pop(stk); break; case '}': if( stk->data[stk->top] != '{' ) return false; else Pop(stk); break; case ']': if( stk->data[stk->top] != '[' ) return false; else Pop(stk); break; default: Push(stk,s[i]); } } /**当前栈为空,并且元素全部遍历完,直接返回true**/ if( isEmptyStack(stk) ) return true; return false; }
四、执行结果
accept
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~