/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @return bool布尔型
 */
typedef struct CharStack{
    int top;

    char data[10001];
}*CharStackPtr;

/**
 *初始化一个空栈
 */
 CharStackPtr charStackInit(){
    CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(struct CharStack));
    resultPtr->top = -1;

    return resultPtr;
 }//of charStackInit

 /**
 *压栈
  */
void push(CharStackPtr paraStackPtr, int paraValue){
    paraStackPtr->top ++;
    paraStackPtr->data[paraStackPtr->top] = paraValue;
}//of push

/**
 弹栈
 */
char pop(CharStackPtr paraStackPtr){
    paraStackPtr->top --;
    return paraStackPtr->data[paraStackPtr->top + 1];
}//of pop

/**
 *括号匹配
 */
bool isValid(char* s ) {
    // write code here
    int len = strlen(s);
    //step 1. 初始化栈并将‘#’作为基础
    CharStackPtr tempStack = charStackInit();
    push(tempStack, '#');
    char tempChar, tempPopedChar;

    //step 2. process the string
    for(int i = 0; i < len; i ++){
        tempChar = s[i];

        switch(tempChar){
            case '(':
            case '[':
            case '{':
                push(tempStack, tempChar);
                break;
            case ')':
                tempPopedChar = pop(tempStack);
                if(tempPopedChar != '('){
                    return false;
                }//of if
                break;
            case ']':
                tempPopedChar = pop(tempStack);
                if(tempPopedChar != '['){
                    return false;
                }//of if
                break;
            case '}':
                tempPopedChar = pop(tempStack);
                if(tempPopedChar != '{'){
                    return false;
                }//of if
                break;
            default:
                break;
        }//of switch
    }//of for i

    tempPopedChar = pop(tempStack);
    if (tempPopedChar != '#'){
        return false;
    }//of if

    return true;
}