一、前言
用棧實現括號匹配:
依次掃描所有字符,遇到左括號入棧,遇到右括號則彈出棧頂元素檢查是否匹配。
匹配失敗的情況:
- 左括號單身
- 右括號單身
- 左右括號不匹配
二、例題
給定一個只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s ,判斷字符串是否有效。
有效字符串需滿足:
1.左括號必須用相同類型的右括號閉合。
2.左括號必須以正確的順序閉合。
示例1:
輸入:s = "()"
輸出:true
示例 2:
輸入:s = "()[]{}"
輸出:true
示例 3:
輸入:s = "(]"
輸出:false
示例 4:
輸入:s = "([)]"
輸出:false
示例 5:
輸入:s = "{[]}"
輸出:true
提示:
1 <= s.length <= 104
s
僅由括號'()[]{}'
組成
代碼:
#include<stdio.h>
#define maxSize 10000
/*棧的結構體定義*/
typedef struct
{
char data[maxSize];
int top;
}SqStack;
/*初始化棧*/
void initStack(SqStack& s)
{
s.top = -1;
}
/*返回棧頂元素*/
int getElem(SqStack s, char& ch)
{
if (s.top == -1)//棧為空
{
return 0;
}
ch = s.data[s.top];
return 1;
}
/*判空*/
int isEmpty(SqStack s)
{
if (s.top == -1)
{
return 1;
}
else
{
return 0;
}
}
/*入棧*/
int Push(SqStack& s,char x)
{
if (s.top == maxSize - 1)//判斷棧滿
{
return 0;
}
++s.top;
s.data[s.top] = x;
return 1;
}
/*出棧*/
int Pop(SqStack& s)
{
if (s.top == -1)//判斷棧空
{
return 0;
}
--s.top;
return 1;
}
int main()
{
SqStack st;
initStack(st);
char s[10000],ch;
scanf("%s", s);
int i = 0;
while (s[i])
{
if (s[i] == '\'' || s[i] == '\'' || s[i] == '\"' || s[i] == '\"')
{
i++;
}
else
{
if (s[i] == '('||s[i]=='{'||s[i]=='[')
{
Push(st, s[i]);
}
else if (s[i] == ')')
{
getElem(st, ch);
if (ch == '(')
{
Pop(st);
}
else
{
break;
}
}
else if (s[i] == ']')
{
getElem(st, ch);
if (ch == '[')
{
Pop(st);
}
else
{
break;
}
}
else if (s[i] == '}')
{
getElem(st, ch);
if (ch == '{')
{
Pop(st);
}
else
{
break;
}
}
}
i++;
}
if (isEmpty(st))
{
printf("true");
}
else
{
printf("false");
}
return 0;
}