2016-02-07 2 views
1

Я хотел бы проверить, содержит ли входная строка такое же количество скобок открытия/закрытия. Если да, распечатайте true else false. Я написал этот код, но есть некоторые ошибки, которые могут кому-то помочь?Как проверить Если скобки одинаковы

See My Code Это прекрасно работает, если я ввожу строку «()», которая начинается с открывающей скобки и заканчивается закрывающей скобкой, но если я вхожу «) (», то она по-прежнему печатает верно ?. Вывод должен быть:

() = true 
(())=true 
()) = false 
(() = false 
)(= false 
)(() = false 
etc... 

Спасибо за помощь

EDIT:

using System; 

public class Program 
{ 
    public void Main() 
{ 

    CheckParentheses ("()"); 
} 

public void CheckParentheses (string inputParentheses){ 

int openParentheses = 0; 
int closeParentheses = 0; 
for (int i = 0; i < inputParentheses.Length; i++) 
{ 
    if (inputParentheses[i] == '(') 
    { 
     openParentheses++; 
    } 

    if (inputParentheses[i] == ')') { 
     closeParentheses++; 
    } 


    if (openParentheses == closeParentheses) 

     Console.WriteLine("true"); 

    } 

} 

} 
+0

@LarsTech вы можете нажать на эту ссылку, и она перенесет вас в мой код. Однако я передал свой код в основной теме. – dipesh

+3

Ваш код выполняет то, что вы описываете, - обнаруживайте такое же количество открытых и закрытых скобок. То, что вам кажется нужным, - найти соответствующие скобки открытия/закрытия. Возможно, попробуйте только один счетчик скобок; приращение на открытом, декремент при закрытии. Если он когда-либо опускается ниже нуля, ответ будет ложным; если он не равен нулю в конце, ответ будет ложным; если он равен нулю, ответ верен. –

ответ

0

Если когда-либо большее количество Closed чем Open, он должен повторно поверните ложь, правильно? Таким образом, вы можете просто добавить в середине вашего цикла:

 if (closeParentheses > openParentheses) { 
     Console.WriteLine("false"); 
    } 
+0

Я одобрил, но вы должны положить 'return' после' WriteLine'. Я не вижу никаких проблем, кроме этого. Ну, у ОП есть еще одна ошибка, которая будет обнаружена с более чем одной парой скобок, потому что проверка равенства должна быть вне цикла. – Dialecticus

4

Вместо подсчета открытия/закрытия parenthesys вы можете проверить их порядок

public void CheckParentheses(string inputParentheses) 
{ 
    // Level counter 
    int parenLevel = 0; 
    for (int i = 0; i < inputParentheses.Length; i++) 
    { 
     // Open always good, increment the level 
     if (inputParentheses[i] == '(') 
      parenLevel++; 
     else if (inputParentheses[i] == ')') 
      parenLevel--; 

     // Closing good, but only if the level doesn't drop under zero 
     if (parenLevel < 0) 
     { 
      Console.WriteLine("false"); 
      return; 
     } 
    } 
    // At the end of the loop, the level should always be zero 
    if(parenLevel != 0) 
     Console.WriteLine("false"); 
    else 
     Console.WriteLine("true"); 
} 
0
public static bool CheckParentheses(string inputParentheses) 
{ 
    if ((inputParentheses.Length % 2) != 0 || inputParentheses[0] ==')' || inputParentheses[inputParentheses.Length-1] == '(') 
     return false; 

    for(int i = 0; i < inputParentheses.Length/2; i++) 
    { 
     if(inputParentheses[i] != '(' || inputParentheses[inputParentheses.Length-i-1] != ')') 
      return false; 
    } 
    return true; 
} 
0

Во-первых, мы должны четко понимать, что свойства, которые мы пытаемся доказать о строке. Это требует некоторого времени, мысли и воображения.

Мы могли бы сказать, что строка должна быть предложением языка, описанного S → "(" S ")" S | ε, и в этом случае наша задача - создать парсер. Строка действительна тогда и только тогда, когда парсер принимает ее.

Другой подход заключается в интерпретации «(» в качестве толчке и «)» как поп для стека, в слева-направо. Затем строка действительна тогда и только тогда, когда обозначенная программа не заполняет пустой стек, а также завершается пустым стеком. Мы можем проверить это, просто запустив программу и наблюдая за состоянием.

Еще один подход - интерпретировать строку «(» и «)» как последовательность «1» и «-1» соответственно. Это похоже на интерпретацию стека - сходство можно увидеть через числа Пеано. Тогда строка действительна тогда и только тогда, когда не существует префиксной суммы, меньшей нуля, а общая сумма равна нулю.

Я объясню, как реализовать целую интерпретацию в C#. Во-первых, начните определение функции со строкой в ​​качестве входного и нашим логическим ответом в качестве вывода.

bool AreParensBalanced(string input) { … }

Сначала интерпретировать скобки как целые числа.

var interpreted = input.Select(c => c == '(' ? 1 : -1);

Следующая найти префикс суммы. Здесь я перехожу к IObservable, потому что Scan не определен для IEnumerable - вы можете определить Scan for IEnumerable, но я предпочел бы использовать существующую реализацию.

var prefixSums = interpreted.ToObservable().Scan(0, (a, b) => a + b).ToEnumerable()

Теперь найти общую сумму.

var totalSum = interpreted.Aggregate(0, (a, b) => a + b);

Зная префиксную сумму и общую сумму, ответ может быть найден.

return prefixSums.All(x => x >= 0) && totalSum == 0;

Обратите внимание, что «не существует такое х, что Р (х) истинно» так же, как «для всех х, а не Р (х) истинно», который, как я пришел до All(x => x >= 0) из спецификации.

Смежные вопросы