有效的括号1

本题来自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


 梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~


猜你喜欢

转载自blog.csdn.net/qiki_tangmingwei/article/details/80210317