我們的內(nèi)心和心智,是決定我們未來命運的最強(qiáng)勁的力量。? ? ? ? ?-- 奧普拉·溫弗瑞
目錄
??一.有效的括號
??1.使用棧實現(xiàn)
??2.完整代碼:
題目描述:
給定一個只包括 '(',')','{','}','[',']'?的字符串 s ,判斷字符串是否有效。
有效字符串需滿足:
1.左括號必須用相同類型的右括號閉合。
2.左括號必須以正確的順序閉合。
3.每個右括號都有一個對應(yīng)的相同類型的左括號。
示例 1:
輸入:s = "()" 輸出:true
示例?2:
輸入:s = "()[]{}" 輸出:true
示例?3:???????
輸入:s = "(]" 輸出:false
做題鏈接:有效的括號
前言:
在5月13號晚上寫了一篇白嫖chatgpt的Edge插件,很難不愛啊的文章,只是隨便寫寫,只想把這個好用的插件分享給大家,但是出乎我的意料,居然上熱榜了,這也是我第一次上熱榜,瀏覽量居然高達(dá)9000,收藏也達(dá)到了驚人的400多。可給我高興壞了,非常感謝各位CSDN人的支持。未來我將更加努力,把自己學(xué)習(xí)的歷程的分享出來,和大家一起進(jìn)步。一起加油,再次感謝。
??一.有效的括號
這題的意思就是,給你一串字符串括號,讓你判斷這個字符串里面的括號是否匹配,如果匹配,就返回true,否則返回false。這題我們就可以使用棧來實現(xiàn)。
我們來回憶一下,之前學(xué)習(xí)的棧是怎么樣的。
棧:一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除操作,進(jìn)行數(shù)據(jù)的插入和刪除操作的一端稱為棧頂。另一端稱為棧底。棧中數(shù)據(jù)元素遵循后進(jìn)先出LIFO(last in first out)。
??1.使用棧實現(xiàn)
思路:
1.我們從頭開始遍歷字符串,當(dāng)遇到左括號也就是{,[,(的其中一個時,直接把這個左括號入棧。2.然后繼續(xù)遍歷字符串,只要遇到左括號就入棧,遇到右括號也就是},],)的其中一個時,直接把棧頂?shù)淖罄ㄌ柍鰲!?br>3.然后判斷這兩個字符是否括號匹配,如果不匹配,直接返回false,如果匹配,就繼續(xù)遍歷字符串,直到遍歷到字符串的尾,如果都匹配,那么就返回true。
老樣子我們還是畫圖來理解一下:
?
?
接著最后三個字符和明顯和棧內(nèi)的字符是匹配的,所以我們返回true。
思路是有了,那我們就可以直接寫代碼了。
注意細(xì)節(jié):容易犯的錯誤。
1.最后返回true時,棧必須為空,才能保證括號的匹配成功了的。
2.第一個字符如果是右括號,那么肯定就不匹配了,直接返回false。
??2.完整代碼:
typedef char STDataType;
typedef struct Stack
{
STDataType* a;
int top; // 棧頂
int Capacity; // 容量
}Stack;
// 初始化棧
void StackInit(Stack* ps);
// 入棧
void StackPush(Stack* ps, STDataType x);
// 出棧
void StackPop(Stack* ps);
// 獲取棧頂元素
STDataType StackTop(Stack* ps);
// 檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0
int StackEmpty(Stack* ps);
// 銷毀棧
void StackDestroy(Stack* ps);
// 初始化棧
void StackInit(Stack * ps)
{
assert(ps);
ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);//動態(tài)的開辟空間
if (ps->a == NULL)
{
perror("malloc\n");
return;
}
ps->top = 0;
ps->Capacity = 4;
}
// 入棧
void StackPush(Stack* ps, STDataType x)
{
assert(ps);
if (ps->top == ps->Capacity)
{
STDataType* temp = (STDataType*)realloc(ps->a, sizeof(STDataType) * ps->Capacity * 2);
if (temp==NULL)
{
perror("realloc\n");
return;
}
ps->Capacity *= 2;//每次增容尾上一次的二倍
ps->a = temp;
}
ps->a[ps->top] = x;
ps->top++;//棧內(nèi)入一個數(shù)據(jù),top就要往上面走一步
}
// 出棧
void StackPop(Stack* ps)
{
assert(ps);
assert(ps->top>0);
ps->top--;
}
// 獲取棧頂元素
STDataType StackTop(Stack* ps)
{
assert(ps);
return ps->a[ps->top-1];
}
// 銷毀棧
void StackDestroy(Stack* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->top = ps->Capacity = 0;
}
// 檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0
int StackEmpty(Stack* ps) {
assert(ps);
return ps->top==0;
}
//上面調(diào)用實現(xiàn)棧的函數(shù)
bool isValid(char * s){
Stack ps;
StackInit(&ps);
while(*s)//遍歷字符串
{
if(*s=='{'||*s=='('||*s=='[')//如果是左括號就直接入棧
{
StackPush(&ps,*s);
}
else
{
if(StackEmpty(&ps))
{//當(dāng)?shù)谝粋€字符為右括號時,即沒有入棧,棧為空,直接返回false即可。
StackDestroy(&ps);
return false;
}
char top=StackTop(&ps);
StackPop(&ps);
if((*s=='}'&&top!='{')
||(*s==')'&&top!='(')
||(*s==']'&&top!='['))
{
StackDestroy(&ps);
return false;//if語句只要有不匹配的,直接返回false
}
}
++s;
}
bool ret=StackEmpty(&ps);//棧為空,那么ret就為真,反之,為假。
StackDestroy(&ps);
return ret;
}
?文章來源地址http://www.zghlxwxcb.cn/news/detail-448303.html
?文章來源:http://www.zghlxwxcb.cn/news/detail-448303.html
?
到了這里,關(guān)于Leetcode刷題之有效的括號的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!