typedef int DataType;
typedef struct Stack{
DataType* array;
int capacity;
int size;
}Stack;
//栈的初始化
void StackInit(Stack* ps)
{
//检测数据
assert(ps);
//申请动态空间
ps->array = (DataType*)malloc(sizeof(DataType)*10);
ps->capacity = 10;
ps->size = 0;
}
void CheckCapacity(Stack* ps)
{
assert(ps);
if (ps->size >= ps->capacity)
{
//申请新空间
int newCapacity = ps->capacity * 2;
DataType* temp = (DataType*)malloc(sizeof(DataType)*newCapacity);
//拷贝元素
if (temp)
{
//memcpy(temp, ps->array, sizeof(DataType)*ps->capacity));
for (int i = 0; i < ps->size; ++i)
temp[i] = ps->array[i];
//释放空间
free(ps->array);
ps->array = temp;
ps->capacity = newCapacity;
}
}
}
//入栈
void StackPush(Stack* ps, DataType data)
{
//检测数据
assert(ps);
//是否扩容
CheckCapacity(ps);
//给ps->array的size插入数据,然后栈顶++
ps->array[ps->size] = data;
ps->size++;
}
//检测栈是否为空
int StackEmpty(Stack* ps)
{
assert(ps);
//空:返回真值,非空:返回假值
return 0 == ps->size;
}
//出栈
void StackPop(Stack* ps)
{
assert(ps);
//检测栈中是否还有元素
if (StackEmpty(ps))
return;
ps->size--;
}
//获取栈顶元素
DataType StackTop(Stack* ps)
{
assert(ps);
return ps->array[ps->size - 1];
}
//获取栈中有效元素的个数
int StackSize(Stack* ps)
{
assert(ps);
return ps->size;
}
//销毁栈
void StackDestory(Stack* ps)
{
assert(ps);
free(ps->array);
ps->capacity = 0;
ps->size = 0;
}
bool isValid(char * s){
//检测数据是否为空
if(NULL == s)
{
return true;
}
//求s的长度
int len = strlen(s);
//定义一个栈
Stack st; //结构体类型的变量
//初始化
StackInit(&st);
//进行括号匹配
for(int i=0;i<len;++i)
{
if(s[i] == '(' || s[i] == '[' || s[i] == '{')
{
//如果是左括号的话,进行入栈
StackPush(&st,s[i]);
}
else
{
//右括号进行匹配
//"))"
if(StackEmpty(&st))
return false;
char ch = StackTop(&st);
if((ch == '(' && s[i] == ')') || (ch == '[' && s[i] == ']') ||
(ch == '{' && s[i] == '}'))
{
//如果匹配的话,就出栈
StackPop(&st);
}
else
return false;
}
}
//循环结束,还有情况:"((())"
if(!StackEmpty(&st))
return false;
return true;
}