題目描述
給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: "()"
輸出: true
示例 2:
輸入: "()[]{}"
輸出: true
示例 3:
輸入: "(]"
輸出: false
示例 4:
輸入: "([)]"
輸出: false
示例 5:
輸入: "{[]}"
輸出: true
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/valid-parentheses
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
白話題目:
輸入括號,按照規則輸出括號是否匹配,不能穿插,沒有其他輸入。
算法:
學過數據結構的小夥伴們會首先想到用棧,類似於見到左括號入棧,右括號出棧,最後棧爲空就算匹配了,中間有不匹配的地方就返回false就OK了。
但是請記住,數據就夠是一種思想,有些題不用自己費盡的去實現所有的數據結構進行push和pop的實現,下面請看用動態數組模擬就好。
詳細解釋關注 B站 【C語言全代碼】學渣帶你刷Leetcode 不走丟 https://www.bilibili.com/video/BV1C7411y7gB
C語言完全代碼
#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>
#include<string.h>
bool isValid(char * s)
{
if (s == NULL || s[0] == '\0') //字符串爲空,算是匹配
return true;
char *stack = (char*)malloc(strlen(s)+1);
int top =0;
int i;
for ( i = 0; s[i]!='\0';i++)
{
if (s[i] == '(' || s[i] == '[' || s[i] == '{')
stack[top++] = s[i]; //所謂的入棧
else //當遇見右邊的時候
{
if ((--top) < 0)
return false;//先減減,讓top指向棧頂元素
if (s[i] == ')' && stack[top] != '(') //看棧頂元素和輸入匹配否
return false;
if (s[i] == ']' && stack[top] != '[')
return false;
if (s[i] == '}' && stack[top] != '{')
return false;
}
}
//都匹配上了就都彈出棧了, top=0,非0就是1
return (!top);//
}
int main()
{
printf("輸入字符串s\n");
char *s;
s=(char *)malloc(sizeof(char));
gets(s);
bool result=isValid(s);
printf("%d\n",result);
return 0;
}