Edhe pse nuk eshte gjuha me e pershtatshme per kete pune une i bera nje zgjidhje ne PHP per te treguar se si mund te simulojme ne kete gjuhe struktura te dhenash si STIVA (Stack) dhe Pemet Binare.
Per stive kam perdor nje array dhe ne vend te funksioneve Push() dhe Pop() perdor vete funksionet e gjuhes array_push() dhe array_pop()
Per pemen binar ekam perdorur nje klase dhe per cdo nyje te pemes krijoj nga nje objekt.
Algoritmi: Kthe Shrehjen ne Postfix me ane te stives
1) Kap elementin e radhes nga input
2) Nqs eshte numer nxirre ate
3)Nqs ehste kllape hapese fute ne stive
4)Nqs eshte kllape mbyllese nxirr nga stiva operatoret deri sa te hasesh nje kllape hapese.
Nxirre kllapen hapese nga stiva dhe injoroje
5)Nqs eshte operator
a)nqs stiva eshte bosh ose kreu i stives esht ekllape hapese fute ne stive
b)nqs ka perparesi me te madhe se kreu i stives fute ne stive
c)Per ndryshe nxirr operatorin nga stiva, paraqite ne output dhe fut operatorin e ri ne stive
6)Nqs ka akoma input shko tek 1
7)Perndryshe nxirr te gjithe operatoret nga stiva dhe paraqit shprehjen
Kam supozuar se shprehja nuk do kete numra me te medhenje se 1 shifer per mos ta komplikuar. Numri i kllapave shte i palimituar. GJithashtu ky kod nuk kontrollon per gabime apo shenja te papranueshme.
Kodi PHP:
<?
/*---------------------------------------------------------------------------
Emri: Sfida e rradhes nga Pr-Tech
Pershkrimi: Krijimi dhe vleresimi i shprehjeve infix- postfix
Punoi: Klesti Hoxha
Data: 25-8-2005
---------------------------------------------------------------------------*/
class nyje_peme { //kjo klase perdoret per te simuluar pemet ne pHP
var $m;
var $d;
var $v;
}
function perparesi($op) { //funksioni percakton perparesine e operatoreve
switch ($op) {
case "+":
case "-":
return 1;
break;
case "*":
case "/":
return 2;
break;
}
}
function veprim($x,$y,$v) { //funksioni kryen nje veprim
switch ($v) {
case "+": return $x+$y;
case "-": return $y-$x;
case "/": return $y/$x;
case "*": return $x*$y;
}
}
function postfix($shprehja) { //funksioni kthen shprehjen ne postfix duke perdorur algoritmin me stive
$shprehja = str_replace(" ","",$shprehja); //pastro shprehjen nga hapesirat
$stiva = array(); //Array qe simulon stiven
$pf = '';
for ($i=0;$i<strlen($shprehja);$i++) {
$s = $shprehja[$i];
if (is_numeric($s)) $pf .= $s;
elseif ($s == '(') array_push($stiva,$s);
elseif ($s == ')') {
$st = array_pop($stiva);
while ($st != '(') {
$pf .= $st;
$st = array_pop($stiva);
}
}
else {
$kreu = $stiva[count($stiva)-1];
if ($kreu == '' || $kreu == '(' || (perparesi($s) > perparesi($kreu))) array_push($stiva,$s);
else {
$pf .= array_pop($stiva);
array_push($stiva,$s);
}
}
} //for
while (current($stiva) != false) {
$pf .= array_pop($stiva);
}
return $pf;
}
function Pema($shprehja) { //Krijon pemen binare nga nje shprehje postfix
$stiva = array(); //array qe simulon stiven
for ($i=0;$i<strlen($shprehja);$i++) {
$s = $shprehja[$i];
if (is_numeric($s)) {
$p = new nyje_peme;
$p->v = $s;
$p->m = NULL;
$p->d = NULL;
array_push($stiva,$p);
}
else {
$p = new nyje_peme;
$p->v = $s;
$p->d = array_pop($stiva);
$p->m = array_pop($stiva);
array_push($stiva,$p);
}
}
return array_pop($stiva);
}
function VleraShprehjes($shprehja) { //Kthen vleren e shprehjes postfix
$stive = array(); //array qe simulon stiven
for ($i=0;$i<strlen($shprehja);$i++) {
$s = $shprehja[$i];
if (is_numeric($s)) array_push($stive,$s);
else {
$x = array_pop($stive);
$y = array_pop($stive);
$vl = veprim($x,$y,$s);
array_push($stive,$vl);
}
}
return array_pop($stive);
}
if (!isset($_POST['jepi'])) {
echo "<form action='$PHP_SELF' method='post'>
Shkruaj Shprehjen: <input type='text' name='shprehja'>
<input type='submit' name='jepi' value='Llogarit Shprehjen'>
</form>";
}
else {
$shprehja = $_POST['shprehja'];
$postfix = postfix($shprehja);
echo "Shprehja postfix ėshtė: $postfix<p>";
$vlera = VleraShprehjes($postfix);
echo "Vlera e Saj ėshtė : $vlera";
}
?>
funksioni Pema() kthen pemen binare te shprehjes qe nuk eshte perdorur ne script. Megjithate nga kjo duke bere bredhjet pararendore, pasrendore dhe nderrendore me ane te funksioneve rekurisive te njohura marrim perkatesisht shprehjet prefix(parashtesore), postfix(passhtesore) dhe infix(ndershtesore)
Shembull:
Kodi PHP:
//Shprehja postfix
function postfix($pema) {
if ($pema != NULL) {
postfix($p->m);
postfix($p->d);
echo $p->v;
}
}
Krijoni Kontakt