用栈解决有效的括号匹配问题

用栈解决有效的括号匹配问题_第1张图片

 

//用数组实现栈
typedef char DataType;
typedef struct stack
{
	DataType* a;//动态数组
	int top;//栈顶
	int capacity; //容量
}ST;

void STInit(ST*pst);//初始化

void STDestroy(ST* pst);//销毁所有空间

void STPush(ST* pst, DataType x);//插入数据到栈中

void STPop(ST* pst);//数据跳出栈顶

DataType SToPop(ST* pst);//访问栈顶元素

bool STEmpty(ST* pst);//判空函数

int STSize(ST* pst);//记录栈内有多少元素(有多少人)



void STInit(ST* pst)//初始化
{
	assert(pst);
	pst->a = NULL; 
	pst->capacity = 0;
	pst->top = 0;
}
void STDestroy(ST* pst)//销毁所有空间
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = 0;
	pst->top = 0;
}
void STPush(ST* pst, DataType x)//插入数据到栈中
{
	assert(pst);
	if (pst->capacity == pst->top)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;//是0就给4,不是0就乘2
		DataType* tmp = (DataType*)realloc(pst->a, sizeof(DataType) * newcapacity);//扩容好的数组地址
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}

	pst->a[pst->top] = x;//栈顶放入元素
	pst->top++;

}

void STPop(ST* pst)//数据跳出栈顶
{
	assert(pst);
	assert(!STEmpty(pst));
	pst->top--;
}

DataType SToPop(ST* pst)//访问栈顶元素
{
	assert(pst);
   assert(!STEmpty(pst));
	return pst->a[pst->top - 1];
}

bool STEmpty(ST* pst)//判空函数
{
	assert(pst);
	return pst->top == 0; //等于0,bool就真了,
}

int STSize(ST* pst)//记录栈内有多少元素(有多少人)
{
	assert(pst);
	return pst->top;
}


bool isValid(char * s){
    ST kit;
    STInit(&kit);
   while(*s)
   {
      //1. 左括号入栈    '(', '[', '{'
      //2. 右括号出栈匹配 ')', ']', '}'
      //3.栈是空那就是匹配成功的,栈不是空就匹配失败"([{ ])"
      //只要有一对不相等就返回false
     if(*s == '(' ||*s == '{' ||*s == '[')
     {
        STPush(&kit,*s);
     }
     else
     {
        if(STEmpty(&kit))//防止"[{}])"还在调用SToPop函数访问造成越界访问
        {
           return false;
        }
        char tmp =SToPop(&kit);
         STPop(&kit);
        if(*s == ')' && tmp != '(' 
         || *s =='}'&& tmp != '{' 
         || *s ==']' && tmp != '[' )//只要有一对不相等就返回false
        {
           return false;
        }
      
     }
      ++s;
   } 
   bool yesno = STEmpty(&kit);//栈是空那就是匹配成功的,栈不是空就匹配失败"([{ ])"
  STDestroy(&kit);
  return yesno;
}

你可能感兴趣的:(数据结构,算法)