您的位置:首页 > 其它

LeetCode | Valid Parentheses(括号匹配)

2014-07-08 11:06 429 查看
Given a string containing just the characters
'('
,
')'
,
'{'
,
'}'
,
'['
and
']'
,
determine if the input string is valid.

The brackets must close in the correct order,
"()"
and
"()[]{}"
are
all valid but
"(]"
and
"([)]"
are
not.

题意很简单,就是判断是否匹配。通过栈来实现,如果左括号等,就入栈,如果右括号类,就出栈并判断是否匹配。当全部匹配完了,还要判断栈是否为空,不为空,也代表匹配不成功!

void ValidParentheses(char *str)
{
if(str == NULL){
printf("empty\n");
return ;
}

char ch;
SqStack S;
int len = strlen(str);
InitStack(&S);
if(len % 2){
printf("odd\n");
return;
}
for(int i = 0;i < len;++i){
if(str[i] == '(' || str[i] == '[' || str[i] == '{'){
Push(&S,str[i]);
}else if(str[i] == ')' || str[i] == ']' || str[i] == '}'){
if(IsEmpty(S)){ //在POP函数中已经设置了错误判断,如果为空,就报错并退出循环。
printf("invalid!\n");   //但是直接退出程序不好,所有就提前判断是否为空,为空就报错,退出函数即可。
return;
}
ch = Pop(&S);
if(!Match(ch,str[i])){
printf("invalid\n");
return ;
}
}else{  //处理输入其他字符的情况
printf("the char doesn't correct!\n");
return ;
}
}
if(!IsEmpty(S)){
printf("doesn't match!\n");
}else
printf("match!\n");
}


完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STACKSIZEINIT 50
#define INCREMENT 10

typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;

void InitStack(SqStack *S)
{
S->base = (char *)malloc(STACKSIZEINIT * sizeof(char));
if(S->base == NULL){
printf("malloc error\n");
exit(1);
}
S->top = S->base;
S->stacksize = STACKSIZEINIT;
}

void Push(SqStack *S,char ch)
{
if(S->top - S->base >= S->stacksize){
S->base = (char *)realloc(S->base,(S->stacksize + INCREMENT)*sizeof(char));
if(S->base == NULL){
printf("malloc error\n");
exit(1);
}
S->top = S->base + S->stacksize;
S->stacksize += INCREMENT;
}
*(S->top++) = ch;
}

int IsEmpty(SqStack S)
{
return S.base == S.top;
}

char Pop(SqStack *S)
{
char ch;
if(IsEmpty(*S)){
printf("stack empty\n");
exit(1);
}
ch = *(--S->top);
return ch;
}

int Match(char a,char b)
{
switch(a){
case '(':
return b == ')';
case '[':
return b == ']';
case '{':
return b == '}';
default :
return 0;
}
}

void ValidParentheses(char *str) { if(str == NULL){ printf("empty\n"); return ; } char ch; SqStack S; int len = strlen(str); InitStack(&S); if(len % 2){ printf("odd\n"); return; } for(int i = 0;i < len;++i){ if(str[i] == '(' || str[i] == '[' || str[i] == '{'){ Push(&S,str[i]); }else if(str[i] == ')' || str[i] == ']' || str[i] == '}'){ if(IsEmpty(S)){ //在POP函数中已经设置了错误判断,如果为空,就报错并退出循环。 printf("invalid!\n"); //但是直接退出程序不好,所有就提前判断是否为空,为空就报错,退出函数即可。 return; } ch = Pop(&S); if(!Match(ch,str[i])){ printf("invalid\n"); return ; } }else{ //处理输入其他字符的情况 printf("the char doesn't correct!\n"); return ; } } if(!IsEmpty(S)){ printf("doesn't match!\n"); }else printf("match!\n"); }

int main()
{
char buf[20];

while(scanf("%s",buf)!=EOF){
ValidParentheses(buf);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: