Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Algorytm sprawdzania poprawności zagnieżdżenia nawiasów
Forum PHP.pl > Forum > PHP
slawa
Jak w temacie. Poszukuje wszelkich wskazówek jak napisać skrypt który sprawdzał by poprawność zagnieżdżenia nawiasów., mając na wejściu tablicę z kolejnymi nawiasami. Może ktoś się spotkał z takim algorytmem -> prosze o informację smile.gif
piczu
to mi przypomina jedno zadanie z konkursu algorytmicznego smile.gif
wrzucasz wszystkie nawiasy na stos albo do tablicy i szukasz nawiasu z domknieciem obok siebie, a gdy je znajdziesz to usuwasz i powtarzasz az nic nie zostanie (co oznacza ze wszystkie sa domkniete) lub zostana same niedomkniete. Mam nadzieje ze oto chodzi.
NuLL
  1. <?php
  2. function sprawdzNawiasy($tablica_nawiasow)
  3. {
  4. list($tab1,$tab2)=array_chunk($tablica_nawiasow,count($tablica_nawiasow)/2);
  5.  
  6. $x=current($tab2)
  7.  
  8. foreach($tab1 as $nawias)
  9. {
  10. if($lol==$nawias) return false;
  11. $x=next($tab2);
  12. }
  13. return true;
  14. }
  15. ?>

Jakos tak winksmiley.jpg
piczu
a to moja wersja smile.gif
  1. <?php
  2. function checkDelimiters($delimiters, $left_delimiter, $right_delimiter) {
  3. if(is_array($delimiters)) $delimiters = implode("",$delimiters);
  4. while(preg_match("/".urlencode($left_delimiter.$right_delimiter)."/",urlencode($delimiters))) {
  5. $delimiters = urldecode(preg_replace("/".urlencode($left_delimiter.$right_delimiter)."/","",urlencode($delimiters)));
  6. }
  7. if (strlen($delimiters)) return false;
  8. return true;
  9. }
  10.  
  11. var_dump( checkDelimiters('((()))','(',')') );
  12. ?>
LBO
To i ja się podłączę.
  1. <?php
  2. /**
  3.  * Funkcja sprawdzająca poprawnośc zagnieżdżenia nawiasów podanych w tablicy
  4.  * $delimiters.
  5.  *
  6.  * @param array $delimiters  Tablica z kolejnymi nawiasami.
  7.  * @return boolean Zwraca TRUE, jeżeli zagnieżdzenie nawiasów jest
  8.  * poprawne lub FALSE w przeciwnym razie.
  9.  */
  10. function checkDelimiters($delimiters) {
  11. // inicjalizacja stosu
  12. $stack = array();
  13. foreach ($delimiters as $delimiter) {
  14. switch ($delimiter) {
  15. case '(':
  16. // każdy nawias otwierający kładziemy na stosie
  17. $stack[] = '(';
  18. break;
  19.  
  20. case ')':
  21. // wykrywa nieprawidłową kolejność nawiasów np. )(())(
  22. if (array_pop($stack) != '(') {
  23. return false;
  24. };
  25. break;
  26.  
  27. default:
  28. print('Błąd, argument nie jest nawiasem'.PHP_EOL);
  29. return false;
  30. break;
  31. };
  32. };
  33. if (count($stack) == 0) {
  34. // jeżeli stos został opróżniony, nawiasy były poprawnie zagnieżdżane.
  35. return true;
  36. };
  37. return false;
  38. };
  39. ?>

edit:
oraz przykład zastosowania.
  1. <?php
  2. $delimiters = array('(', '(', '(', ')', ')', ')');
  3. var_dump(checkDelimiters($delimiters)); // bool(true)
  4.  
  5. $delimiters = array(')', '(', '(', '(', ')', ')');
  6. var_dump(checkDelimiters($delimiters)); // bool(false)
  7. ?>
.radex
Cytat(piczu @ 3.07.2006, 19:47 ) *
wrzucasz wszystkie nawiasy na stos albo do tablicy i szukasz nawiasu z domknieciem obok siebie, a gdy je znajdziesz to usuwasz i powtarzasz az nic nie zostanie (co oznacza ze wszystkie sa domkniete) lub zostana same niedomkniete.


Też coś dam. Sam do końca nie wiem jak to zrobić, ale wg. tego jak napisał piczu to będzie to wygladało mniej-wiecej tak:

  1. <?php
  2. function sprawdz( $tablica , $beg , $end ){
  3.  
  4. $begTag = $beg;
  5. $endTag = $end;
  6.  
  7. $tablica1 = explode( ' ' , $tablica ); // usuwamy spacje
  8.  
  9. $tags = $begTag.$endTag ;
  10.  
  11. $tablica2 = explode( $tags , $tablica1 ); // usuwamy ()
  12.  
  13. if ($tablica2 != ''){
  14. $wynik = FALSE ;
  15. }else{
  16. $wynik = TRUE ;
  17. }
  18. ?>


i przykład :
  1. <?php
  2. include 'function.check.php';
  3.  
  4. sprawdz ( '[[][]][][][' , '[' , ']' );
  5.  
  6. if($wynik = FALSE) { echo 'popraw'; }
  7. ?>


ma to kilka bledow i nie wiem czy by zadzialalo, ale tam...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.