← strona głównaProgramowanie (Програмування)

Zadanie na sprawdzenie poprawności rozmieszczenia nawiasów (Ruby)

Warunek dla zadania jest następujący. Stwórz funkcję valid_braces, która przyjmuje ciąg składający się tylko z nawiasów: ()[]{}. Funkcja powinna zwracać true, jeśli wszystkie nawiasy otwierają się i zamykają w poprawn...

Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
Warunek dla zadania jest następujący. Stwórz funkcję valid_braces, która przyjmuje ciąg składający się tylko z nawiasów: ()[]{}.
 Funkcja powinna zwracać true, jeśli wszystkie nawiasy otwierają się i zamykają w poprawnej kolejności, lub false — jeśli nawiasy są źle ustawione.
Przykład wykonania metody:
valid_braces("()")         → true  
valid_braces("({[]})")     → true  
valid_braces("({[)]}")     → false  
valid_braces("(((()")      → false  
valid_braces("{[()]}[]")   → true

Jak działa sprawdzanie nawiasów?

To zadanie klasycznie rozwiązuje się za pomocą stosu — struktury danych, która działa na zasadzie „ostatni wszedł — pierwszy wyszedł”.
Idea polega na tym, aby dodawać nawiasy otwierające do stosu, a gdy natrafimy na nawias zamykający — sprawdzać, czy odpowiada on temu, który jest na szczycie stosu. Jeśli tak — usuwamy ze stosu; jeśli nie — ciąg jest nieprawidłowy.

Test (RSpec) dla sprawdzenia metody

RSpec.describe '#valid_braces' do
  it 'zwraca true dla poprawnych nawiasów' do
    expect(valid_braces('()')).to eq(true)
    expect(valid_braces('([])')).to eq(true)
    expect(valid_braces('{[()]}')).to eq(true)
    expect(valid_braces('{[()]}[]')).to eq(true)
  end

  it 'zwraca false dla niepoprawnych nawiasów' do
    expect(valid_braces('[(])')).to eq(false)
    expect(valid_braces('({[)]}')).to eq(false)
    expect(valid_braces('((')).to eq(false)
    expect(valid_braces(']')).to eq(false)
  end
end

Metoda valid_braces

def valid_braces(string)
  stack = []
  pairs = { ')' => '(', ']' => '[', '}' => '{' }

  string.each_char do |char|
    if pairs.values.include?(char)
      stack.push(char)
    elsif pairs.keys.include?(char)
      return false if stack.pop != pairs[char]
    end
  end

  stack.empty?
end

Zasada działania algorytmu

  1. Za każdym razem, gdy widzimy nawias otwierający — dodajemy go do stosu.
  2. Jeśli natrafimy na nawias zamykający — porównujemy go z ostatnim nawiasem otwierającym (ze szczytu stosu).
  3. Jeśli się zgadzają — kontynuujemy.
  4. Jeśli nie — od razu zwracamy false.
  5. Jeśli po przejściu ciągu stos jest pusty — wszystkie nawiasy zostały poprawnie zamknięte, więc zwracamy true.
To podejście można stosować do parzystych symboli dowolnego typu — nie tylko nawiasów. Doskonale nadaje się do sprawdzania poprawności zagnieżdżonych struktur, na przykład w parserach lub analizatorach HTML.

🔥 Więcej postów

Wszystkie wpisy