力扣第20题(用栈实现)

有效括号字符串中最后出现的左括号最先被匹配(LIFO),可以用“栈”实现该特点。

循环遍历字符串,遇到左括号压入栈中,遇到右括号就“消耗”一个左括号(栈顶出栈),检查两个字符是否匹配,如果匹配继续往后遍历;不匹配则字符串无效。遇到右括号,如果此时栈为空--右括号单身。字符串已经遍历完毕,如果此时栈非空--左括号单身。

class Solution {
public:
#define MaxSize 10000
//定义栈
typedef struct {
    char data[MaxSize];
    int top;
}Sqstack; 
//初始化栈
void InitStack(Sqstack &stack)
{
    stack.top=0;
}
//判断是否为空
bool IsEmpty(Sqstack stack)
{
    if(stack.top==0)
    {
        return true;
    }else{
        return false;
    }
}
//入栈
bool push(Sqstack &stack,char e)
{
    if(stack.top==MaxSize)
    {
        return false;
    }
    stack.data[stack.top++]=e;
    return true;
}
//出栈
bool pop(Sqstack &stack,char &c)
{
    if(IsEmpty(stack))
    {
        return false;
    }
    c=stack.data[--stack.top];
    return true;
}
//是否有效
 bool isValid(string s){
    Sqstack stack;
    InitStack(stack);
    char u;
    //长度不可为单数
    if(s.length()%2!=0){
        return false;
    }
    for(int i=0;i<s.length();i++) {
      //遇到左括号入栈,右括号出栈
      if(s[i]=='('||s[i]=='{'||s[i]=='['){
          push(stack,s[i]);
      }else {
          if(IsEmpty(stack)) return false;
          pop(stack,u);
          if(s[i]==')'&&u!='(') return false;
          if(s[i]=='}'&&u!='{') return false;
          if(s[i]==']'&&u!='[') return false;
       }
  }
  return IsEmpty(stack);//栈为空则合法
}
};

复习数据结构时老师讲了这题,就顺便把栈的定义和基本操作写上了,写得很潦草,初次写,有不妥的地方欢迎指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值