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

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

Rozważmy prostą wersję rozwiązania zadania na sprawdzenie poprawności rozmieszczenia nawiasów (Ruby).

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