本题来自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
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~