本篇博客給大家帶來的是用C++語言來解答有效的括號!
🐟🐟文章專欄:每日一練
🚀🚀若有問題評論區下討論,我會及時回答
??歡迎大家點贊、收藏、分享!
今日思想:不服輸的少年啊,請你再努力一下!
題目描述:?
思路:
? ? ? ? 我們利用棧來解答,首先遍歷數組我們找左括號把他放到棧里,然后再找游括號來看看是否與之匹配。如果遍歷完之后棧為空代表匹配完成返回true,反之返回false。
? ? ? ? 注意如果沒學習過棧的可以看看這篇博客:【C++】數據結構 棧的實現-CSDN博客
代碼實例:
typedef char STDataType;
typedef struct Stack
{STDataType* arr;int top;//指向棧頂的結構int capacity;//容量
}ST;//棧的初始化
void STInit(ST* ps)
{ps->arr = NULL;ps->top = ps->capacity = 0;
}
//入棧-棧頂
void StackPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){//空間不夠-增容int newCapacity = ps->capacity == 0 ? 4 : 2*ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}//空間夠了ps->arr[ps->top++] = x;
}
//判斷棧是否為空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}
//拿棧頂的數據
STDataType StackTop(ST* ps)
{assert(!StackEmpty(ps));return ps->arr[ps->top - 1];
}
//棧的銷毀
void STDestroy(ST* ps)
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->top = ps->capacity = 0;
}
//出棧-棧頂
void StackPop(ST* ps)
{assert(!StackEmpty(ps));--ps->top;
}
bool isValid(char* s)
{ST st;STInit(&st);char* pi=s;//遍歷所有的字符串swhile(*pi !='\0'){if(*pi=='(' ||*pi=='[' ||*pi=='{'){StackPush(&st,*pi);}else{//找右括號并且與之匹配if(StackEmpty(&st))//判斷棧是否為空{STDestroy(&st);return false;}char top=StackTop(&st);if((top=='(' && *pi != ')')|| (top=='[' && *pi !=']')|| (top=='{' && *pi !='}')){STDestroy(&st);return false;}StackPop(&st);}pi++;}//棧為空,說明所有的左括號都已經匹配完,反之非有效字符bool ret =StackEmpty(&st)?true:false;return ret;
}
完!!?