[C++/PTA] 브래킷 매칭

주제 요구 사항

여섯 종류의 대괄호()[]{}만 포함된 문자열이 주어지면 문자열에서 대괄호의 일치가 유효한지, 즉 해당 대괄호의 번호와 중첩 순서가 완전히 올바른지 판단하십시오.

입력 형식:
첫 번째 줄에 정수 T(T<=10),
다음 T 줄의 각 줄에 있는 문자열은 [{()}] 6자만 포함합니다(문자열 길이는 2e5 이내).

출력 형식:
각 문자열에 대해 일치 출력 Yes, 그렇지 않으면 출력 No

입력 예시:
2
{()[]}
([)]

샘플 출력:

아니요

문제 해결 아이디어

이것은 일반적인 스택 애플리케이션 문제입니다. 주어진 문자열을 탐색하고 왼쪽 괄호를 만날 때마다 스택에 밀어넣고 오른쪽 괄호를 만날 때 스택의 맨 위 요소가 해당 왼쪽 괄호인지 판단하고 그렇다면 맨 위 요소를 팝할 수 있습니다. 스택하고 계속 일치합니다. 그렇지 않으면 괄호가 일치하지 않습니다. 순회 후 스택이 비어 있으면 괄호가 성공적으로 일치합니다.

자세한 내용은 다음과 같습니다.

1. 먼저 문자열 길이가 홀수인지 판단하고 홀수이면 일치시킬 수 없으며 직접 false를 반환합니다.

2. 문자열의 각 문자를 순회하여 왼쪽 괄호이면 스택으로 푸시하고 오른쪽 괄호이면 스택의 맨 위 요소가 일치하는지 판단하여 일치하면 스택의 최상위 요소가 팝되고, 그렇지 않으면 false가 반환됩니다.

3. 순회 후 스택이 비어 있으면 괄호가 성공적으로 일치한 것이므로 true를 반환하고 그렇지 않으면 false를 반환합니다.

코드

#include <iostream>
#include <stack>
using namespace std;
stack<char> st;  // 使用栈来进行括号匹配
bool isMarch(string str){
    
      // 定义函数,判断给定字符串中的括号是否匹配
    int len = str.size();  // 获取字符串的长度
    if(len%2) return false;  // 首先判断字符串的长度是否为奇数,如果是奇数则无法匹配,直接返回 false
    for(int i=0;i<str.size();i++){
    
      // 遍历字符串中的每个字符
        switch(str[i]){
    
      // 判断当前字符是否为左括号或右括号
            case '(':
            case '[':
            case '{': st.push(str[i]);break;  // 左括号入栈
            case ')':
                if(!st.empty()&&st.top()=='(') st.pop();  // 当遇到右括号时,判断栈顶是否与之匹配,若匹配则弹出栈顶元素,否则返回 false
                else return false;
                break;
            case ']':
                if(!st.empty()&&st.top()=='[') st.pop();
                else return false;
                break;
            case '}':
                if(!st.empty()&&st.top()=='{') st.pop();
                else return false;
                break;
        }
    }
    return true;  // 遍历结束后如果栈为空,则说明括号匹配成功,返回 true,否则返回 false
}
int main(){
    
    
    int T;
    string str;
    cin >> T;  // 输入 T,表示后面有 T 个测试数据
    while(T--){
    
    
        cin >> str;  // 输入字符串
        cout << ((isMarch(str)) ? "Yes" : "No") << endl;  // 输出结果,如果括号匹配成功则输出 Yes,否则输出 No
    }
    return 0;
}

요약하다

이 질문은 주로 합계 등과 같은 기본 연산을 검사 栈的应用합니다 字符串的遍历、判断. 독자는 스택의 맨 위 요소 밀기, 팝핑 및 가져오기를 포함하여 스택의 관련 작업을 사용하는 데 능숙해야 합니다.

나는 Qiu라고 말했다 . 다음에 보자.

おすすめ

転載: blog.csdn.net/2301_77485708/article/details/131220194