OJ题 有效的括号--用栈检验括号是否匹配

题目描述:

 思路:遍历字符串所有元素,若为左括号,则入栈,如果为右括号,则直接获取栈顶元素,看是否匹配。

typedef char DataType;
typedef struct stack{
    DataType *array;
    int capacity;
    int top; 
}stack;

//栈的初始化
void stackInit(struct stack *ps,int capacity)
{
    assert(ps);
    ps->array=(DataType*)malloc(sizeof(DataType)*capacity);
    if(NULL==ps->array)
    {
       // assert(0);
        return ;
    }
    ps->capacity=capacity;
    ps->top=0;
   
}

//销毁
void stackDestory(struct stack *ps)
{
    assert(ps);
    if(ps->array)
    {
        free(ps->array);
        ps->capacity=0;
        ps->top=0;

    }
   
}

//检查容量
void checkCapacity(struct stack *ps)
{
   assert(ps);
  int newCapacity=0;
   
    if(ps->top==ps->capacity)
    {
       newCapacity=(ps->capacity<<1);
      DataType *temp=(DataType *)malloc(sizeof(DataType)*newCapacity);
    if(NULL==temp)
    {
        assert(0);
        //return ;
    }
    memcpy(temp,ps->array,sizeof(DataType)*ps->capacity);
    free(ps->array);
    ps->array=temp;
    ps->capacity=newCapacity;

    }
   

}

//入栈
void stackPush(struct stack *ps,char data)
{
    checkCapacity(ps);
    ps->array[ps->top]=data;
    ps->top++;
}

bool stackEmpty(struct stack*ps)
{
    assert(ps);
   return ps->top==0;
}

//出栈
void stackPop(struct stack* ps)
{
    if(stackEmpty(ps))
    {
        return ;
    }
    assert(ps);
    ps->top--;
}

//获取栈顶元素
char stackTop(struct stack* ps)
{
    return ps->array[ps->top-1];
}


bool isValid(char * s){
    bool flag=true;
    stack mystack;
    stackInit(&mystack,10000);
int size=strlen(s);
for(int i=0;i<size;i++)
{
  if((s[i]=='(')|| (s[i]=='[')||(s[i]=='{')) //若为左括号,则入栈
  {
      stackPush(&mystack,s[i]);
  }
  else
  {
    if(stackEmpty(&mystack))  //若数据中只有右括号,则当前栈为空,不能直接获取栈顶元素,要先判断栈是否为空
    {
      flag=false;
      break;
    }
    char stackTopElem=stackTop(&mystack);
    if(!((stackTopElem=='('&&s[i]==')')||(stackTopElem=='['&&s[i]==']')||(stackTopElem=='{'&&s[i]=='}')))
    {
        flag=false;
        break;
    }
    stackPop(&mystack);
  }

}

if(!stackEmpty(&mystack)) //若循环结束后栈不为空,则说明括号不匹配
{
    flag=false;
}
stackDestory(&mystack);

return flag;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值