표현식 exp가 있다고 가정하고 exp 주위에 중복된 괄호 세트가 있는지 여부를 확인해야 합니다. 하나의 하위 표현식이 둘 이상의 괄호 세트로 둘러싸여 있는 경우 표현식에는 중복 괄호가 있습니다. 예를 들어 표현식이 −
와 같은 경우(5+((7−3)))
여기서 하위 표현식(7 – 3)은 두 개의 괄호 쌍으로 둘러싸여 있으므로 중복 괄호입니다.
이 문제를 해결하기 위해 스택을 사용합니다. 우리는 exp의 각 문자를 반복하고 문자가 여는 괄호 '(' 또는 연산자 또는 피연산자 중 하나라도 스택에 푸시합니다. 문자가 닫는 괄호일 때 스택에서 반복적으로 문자를 팝합니다. 일치하는 여는 괄호가 발견되고 여는 괄호 쌍과 닫는 괄호 쌍 사이에서 만나는 모든 문자에 대해 값이 증가하는 카운터가 사용될 때까지 카운터 값과 동일한 값이 1보다 작은 경우 중복 괄호 쌍 은(는) 있지만 그렇지 않으면 찾을 수 없습니다.
예시
#include<iostream>
#include<stack>
using namespace std;
bool hasDuplicateParentheses(string str) {
stack<char> stk;
for (int i = 0; i<str.length(); i++) {
char ch = str[i];
if (ch == ')') {
char top = stk.top();
stk.pop();
int count = 0;
while (top != '(') {
count++;
top = stk.top();
stk.pop();
}
if(count < 1) {
return true;
}
}
else
stk.push(ch);
}
return false;
}
int main() {
string str = "(5+((7-3)))";
if (hasDuplicateParentheses(str))
cout << "Duplicate parentheses has Found";
else
cout << "No Duplicates parentheses has Found ";
}을(를) 찾았습니다. 출력
Duplicate parentheses has Found