生活随笔
收集整理的這篇文章主要介紹了
LeetCode20.有效的括号——纯C
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
“尋尋覓覓冷冷清清凄凄慘慘戚戚”
“三杯兩盞淡酒,怎敵他晚來風急”
這道題是括號匹配問題,典型對 棧的應用的題目。
如何創建一個順序棧在前面的博文已經實現:傳送門。
題目描述
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。
題目鏈接
LeetCode20. 有效的括號.簡單
題目分析
括號匹配問題,典型的對數據結構 棧的應用。
以我現在初學數據結構的水平,LeetCode雖然表明它是個簡單題,但對我來說并不簡單,知識儲備量不夠多,用純C解決的話,很繁瑣。
我的思路是先需要創建一個順序結構的棧,然后用棧的基本功能如:壓棧(StackPush),出棧(StackPop),得到棧頂的元素(StackTop)等功能 來完成這道題。
思路:
1.遍歷整個字符串“ ‘(’,’)’,’{’,’}’,’[’,’]’ ”。
2.在遍歷的過程中如果遇到左括號’(’,或者’{’,或者’[’。進行壓棧操作(StackPush)。
3.如果遇到右括號’)’,或者’}’,或者’]’,則進行訪問棧頂元素的值的操作(StackTop),如果棧頂的左括號和其中之一的右括號匹配,則進行出棧操作(StackPop)。
4.直到字符串越界循環結束。
代碼實現
注意:在實現的過程中,需要注意極端情況。
普通情況正常人都能想到。而極端情況就不一定了。
而且題目的實例中可沒有給哦。
1.假如只有一個左括號‘(’呢?
//提示:只有一個左括號時,棧就不為空了。
2.假如只有一個右括號‘)’呢?
//提示:只有一個右括號時棧為空。
typedef char STDataType
;typedef struct Stack
{STDataType
* a
;int top
;int capacity
;
}ST
;
void StackInit(ST
* ps
);
void StackDestroy(ST
* ps
);
void StackPush(ST
* ps
, STDataType x
);
void StackPop(ST
* ps
);
STDataType
StackTop(ST
* ps
);
bool
StackEmpty(ST
* ps
);
int StackSize(ST
* ps
);
void StackInit(ST
* ps
)
{assert(ps
);ps
->a
= NULL;ps
->capacity
= 0;ps
->top
= 0;
}
void StackDestroy(ST
* ps
)
{assert(ps
);free(ps
->a
);ps
->a
= NULL;ps
->capacity
= 0;ps
->top
= 0;}
void StackPush(ST
* ps
, STDataType x
)
{assert(ps
);if (ps
->top
== ps
->capacity
){int newcapacity
= ps
->capacity
== 0 ? 4 : ps
->capacity
* 2;STDataType
* new
= (STDataType
*)realloc(ps
->a
, sizeof(STDataType
) * newcapacity
);if (new
== NULL){printf("realloc fail\n");exit(-1);}ps
->a
= new
;ps
->capacity
= newcapacity
;}ps
->a
[ps
->top
] = x
;ps
->top
++;
}
void StackPop(ST
* ps
)
{assert(ps
);assert(ps
->top
> 0);ps
->top
--;
}
STDataType
StackTop(ST
* ps
)
{assert(ps
);assert(ps
->top
> 0);return ps
->a
[ps
->top
- 1];
}
bool
StackEmpty(ST
* ps
)
{assert(ps
);return ps
->top
== 0;
}
int StackSize(ST
* ps
)
{assert(ps
);return ps
->top
;
}
bool
isValid(char* s
)
{ST st
;StackInit(&st
);while (*s
){if (*s
== '(' || *s
== '{' || *s
== '['){StackPush(&st
, *s
);s
++;}else{if (StackEmpty(&st
)){return false
;}char top
= StackTop(&st
);if (*s
== ')' && top
== '(' || *s
== '}' && top
== '{' || *s
== ']' && top
== '['){StackPop(&st
);s
++;}else{return false
;}}}if (!StackEmpty(&st
)){return false
;}return true
;StackDestroy(&st
);
}
總結
以上是生活随笔為你收集整理的LeetCode20.有效的括号——纯C的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。