括號匹配算法
題目來自網絡搜集和常考算法,如有侵權請聯系我
題目描述
給出一個僅包含字符'(',')','{','}','['和']',的字符串,判斷給出的字符串是否是合法的括號序列
括號必須以正確的順序關閉,"()"和"()[]{}"都是合法的括號序列,但"(]"和"([)]"不合法。
- 示例1
輸入
"["
輸出
false
- 示例2
輸入
"[]"
輸出
true
C++
#include<unordered_map>
class Solution {
public:
/**
*
* @param s string字符串
* @return bool布爾型
*/
bool isValid(string s) {
// write code here
unordered_map<char,char> m = { {')','('},{']','['},{'}','{'} };
stack<char> st;
int len=s.length();
for (int i=0;i<len;i++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
st.push(s[i]);
}
else if (st.empty()) return false;
else if (st.top() != m[s[i]]) return false;
else st.pop();
}
return st.empty();
}
};
C語言
#include <stdio.h>
#include <string.h>
int top=-1;//top變量時刻表示棧頂元素所在位置
void push(char * a,int elem){
a[++top]=elem;
}
void pop(char* a){
if (top==-1) {
return ;
}
top--;
}
char visit(char * a){
//調取棧頂元素,不等於彈棧,如果棧為空,為使程序不發生錯誤,返回空字符
if (top!=-1) {
return a[top];
}else{
return ' ';
}
}
int main() {
char a[30];
char bracket[100];
printf("請輸入括號序列:");
scanf("%s",bracket);
getchar();
int length=(int)strlen(bracket);
for (int i=0; i<length; i++) {
//如果是左括號,直接壓棧
if (bracket[i]=='('||bracket[i]=='{') {
push(a, bracket[i]);
}else{
//如果是右邊括號,判斷與棧頂元素是否匹配,如果匹配,棧頂元素彈棧,程序繼續運行;否則,發現括號不匹配,輸出結果直接退出
if (bracket[i]==')') {
if (visit(a)=='(') {
pop(a);
}else{
printf("括號不匹配");
return 0;
}
}else{
if (visit(a)=='{') {
pop(a);
}else{
printf("括號不匹配");
return 0;
}
}
}
}
//如果所有括號匹配完成,棧內為空,說明所有括號全部匹配成功
if (top!=-1) {
printf("括號不匹配");
}else{
printf("括號匹配");
}
}
Java
import java.util.Stack;
public class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (c == '(')
stack.push(')');
else if (c == '{')
stack.push('}');
else if (c == '[')
stack.push(']');
else if (stack.isEmpty() || stack.pop() != c)
return false;
}
return stack.isEmpty();
}
}