Сделайте это с std :: stack . Идея состоит в том, чтобы
- Если стек пуст, pu sh
s[i]
в стек. - Сравнить текущий символ aka
s[i]
с stack.top()
и всплывающий стек, если он совпадает . - Pu sh текущий символ, также известный как
s[i]
, в стек, когда совпадений не найдено.
Предположим, что ввод: "() (())". Теперь
A. i = 0. Первоначально стек пуст. Pu sh "(" в стеке. Стек - "(".
B. I = 1. Стек не пуст. Сравнить ")" aka s 1 с вершиной стека - "(". Это совпадает. Теперь поп-стек. Стек - "".
C. I = 2. Теперь стек пуст. Pu sh "(" в стеке. Стек - " (".
D. I = 3. Стек не пустой. Сравнить" ("aka s [3] с вершиной стека -") ". Не соответствует. Теперь pu sh" ( "to stack. Stack -" (("
E. i = 4. Стек не пустой. Сравните") "aka s [4] с верхом стека -" (". Это соответствует. Теперь, стек pop.. Stack - "("
F. i = 5. Стек не пустой. Сравните ")" aka s [5] с верхом стека - "(". Это соответствует. Теперь, pop pop . Stack - ""
Теперь, стек пуст, мы можем сказать, что строка аккуратная - как уже упоминалось в вопросе. Если бы мы оставили в стеке какие-либо непревзойденные скобки, это означало бы, что строка не аккуратная.
//Assuming s is the char array containing parenthesis sequence.
int i = 0;
std::stack<char> st;
while(s[i] != '\0') //Better choice would be to use std::string
{
if(st.empty() )
{
st.push( s[i++] );
continue;
}
if( st.top() == '(' && s[i] == ')' )
{ st.pop(); i++ }
else
st.push(s[i++]);
}
if(st.empty() )
printf("Yes");
else
printf("No");