Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Algorytm sprawdzania poprawności zagnieżdżenia nawiasów, ...poszukiwany
slawa
post
Post #1





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 8.02.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
piczu
post
Post #2





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 4.01.2005
Skąd: piczu.info

Ostrzeżenie: (10%)
X----


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.


--------------------
pozdrawiam :)
Go to the top of the page
+Quote Post
NuLL
post
Post #3





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


  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


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
piczu
post
Post #4





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 4.01.2005
Skąd: piczu.info

Ostrzeżenie: (10%)
X----


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. ?>


--------------------
pozdrawiam :)
Go to the top of the page
+Quote Post
LBO
post
Post #5





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował LBO 4.07.2006, 01:24:03
Go to the top of the page
+Quote Post
.radex
post
Post #6





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

Ostrzeżenie: (0%)
-----


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...


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 01:50