[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라고 말했다 . 다음에 보자.