Польская запись

Только мне кажется, что ТС-у preg_match нужна?
 
baev, смотря где. еще ему может быть полезен in_array. но это пока для него слишком сложно.
 
Автор оригинала: Beavis
зачем тут паттерны? ему же посоветовали использовать сравнение "<" ">"
может затем, чтобы уметь решать задачи не одним способом?
 
а, ну давайте, несмотря на то, что он не умеет работать со строками, научим пользоваться регулярными выражениями! отличная идея!
 
Автор оригинала: Beavis
а, ну давайте, несмотря на то, что он не умеет работать со строками, научим пользоваться регулярными выражениями! отличная идея!
ну он же имеет право хотя бы знать о них) он когда их увидит, скорее всего не полезет разбираться, а вообще регулярки они ж не только в php.
 
Посмотрел что такое регулярные выражения и принципы работы с ними, на мой взгляд именно эту задачу они немного усложнят, хотя возможно я ошибаюсь (но позже обязательно для общего развития придумаю себе задачу с ними). Дело в том что как таковой шаблон какой-либо строки здесь задать сложно, по крайней мере так, чтоб потом было удобнее его обрабатывать (конечно, мое мнение новичка может быть ошибочным).

Появился вопрос и нигде не могу найти ответ - есть ли в PHP функция по типу goto , В программе появился вложенный switch..case, break выкидывает из одного switch..case, и продолжает проходить по циклу, а мне надо чтобы в определенное время он вышел из обоих ...
 
Появился вопрос и нигде не могу найти ответ - есть ли в PHP функция по типу goto , В программе появился вложенный switch..case, break выкидывает из одного switch..case, и продолжает проходить по циклу, а мне надо чтобы в определенное время он вышел из обоих ...
PHP:
for () {
   switch () {
       case 1:
            ....
            break; // exit from switch
       case 2:
            break 2; // exit from for
   }
}
 
Всем спасибо огромное! Первый скрипт готов! (пока без поддержки скобок, чуть позже сделаю). Какие-то навыки уже приобрел :)

Кому интересно:

PHP:
<?php

Function Polsha($formula)
{
	print('Ok <br>');
	print("$formula <br>");
	$formula = str_replace(" ","", $formula);
			$dl=strlen($formula);
			$x='';
			$all='';
			$predprior=0;
			$mass='';
			$masspr='';
			for ($i = 0; $i <= $dl-1; $i++)
			{
				$simbol=substr($formula,$i,1);
				switch($simbol)
				{
					case "a": case "b": case "c": case "d": case "e":
						print($simbol);
						break;
					case "*": case "/":
						$prior=2;
						$k=strlen($masspr);
						if ($k != 0)
						{
						$d=substr($masspr,$k-1,1);
						switch ($d)
						{
						case "0": case "1": case "2":
							$masspr .= $prior;
							$mass .= $simbol;
							break 2;
						case "3": case "4": case "5": case "6":
							$k1=strlen($mass);
							for ($k1;;$k1--)
							{
								$k2=strlen($masspr);
								$d1=substr($masspr,$k2-1,1);
								switch ($d1)
								{
								case "3": case "4": case "5": case "6":
									$mass=substr($mass,0,-1);
									$masspr=substr($masspr,0,-1);
									print($simbol);
									break 4;
								case "0": case "1": case "2":
									$masspr .= $prior;
									$mass .= $simbol;
									break 4;
								}
							}
						break 2;
						}} else
						{
						$masspr .= $prior;
						$mass .= $simbol;
						}
						break;
					case "+": case "-":
						$prior=1;
						$k=strlen($masspr);
						$d=substr($masspr,$k-1,1);
						switch ($d)
						{
						case "0": case "1":
							$masspr .= $prior;
							$mass .= $simbol;
							break 2;
						case "2":
							$k1=strlen($mass);
							for ($k1;;$k1--)
							{
								$k2=strlen($masspr);
								$d1=substr($masspr,$k2-1,1);
								switch ($d1)
								{
								case "2": case "3": case "4": case "5": case "6":
									$g = substr($mass, strlen($mass)-1,1);
									$mass=substr($mass,0,-1);
									$masspr=substr($masspr,0,-1);
									print($g);
									break;
								case "0": case "1":
									$masspr .= $prior;
									$mass .= $simbol;
									break 4;
								}
							}
						}
				/*	case "(":
					    $mass = $mass.$simbol;
					    break;
					case ")":
						for ($j=strlen($mass); $j > 0; $j--)
						{
						$simbol1=substr($mass,$j,1);
						$all=$all.$simbol1;
						break;*/
				}
			}

	$k3=strlen($mass);
	for ($k3-1; $k3>=0; $k3--)
	{
		print(substr($mass, $k3-1,1));
		$mass=substr($mass,0,-1);
	}
}

						
$formula = 'a/b*c/d+e+a+b/c+e';
print(Polsha($formula));
?>
Работает как надо! :)
 
Неправильно работает. Для приведённого выражения должно быть "a b / c * d / e + a + b c / + e +"
 
У нас наверное разные подходы :)
По крайней мере нас учили, что если приоритет текущей операции = приоритету предыдущей, то его тоже в стек ...


Есть вариант с рабочими скобками и автоматической генерацией выражения, только файлы почему-то нельзя прикреплять ...
 
Ну тогда у тебя выражение будет выполняться справа налево, если операторы имеют одинаковый приоритет, т.е. сначала выполнится
c / d, затем b * ( c / d ) и т.д., что, по-моему, является несколько странным поведением.

P.S. В PHP стек принято реализовывать с помощью массивов и функций array_push()/array_pop().
 
У меня новое задание :) Теперь хочу вывести дерево разбора, используя полученную польскую запись.

Придумал такой алгоритм:
Читаем Польскую запись сзада наперед:
Первый знак - всегда операция - помещаем в корень
Далее Читаем след исмвол:
1) операция:
а) Если предыдущий считанный символ - операция - поместить в Правое поддерево(ПП)

б) Если предыдущий считанный символ - буква
Функция SpuskLP:
Поднимаемся на уровень выше
Если ЛП = 0, то помещаем в ЛП
Иначе - Функция SpuskLP

2) Буква:
а) Пред. символ - операция:
Поместить в ПП
б) Пред сивол - буква:
Если ЛП = 0, то Поместить в ЛП
Иначе -
Фунцкия SpuskLP2:
Подняться На уровень выше
Если ЛП = 0, то поместить в ЛП
Иначе - SpuskLP2

-~{}~ 15.03.10 18:15:

Вопрос в следущем, читал про деревья в PHP - здесь они немного в другом представлении - как список, а нет ли каких-нибудь функций для работы с бинарными деревьями?
Или придется пользоваться стандартными функциями и выдумывать велосипед?

-~{}~ 15.03.10 18:32:

Возникла идея - создать класс Three, где
1) Вершина $V
$V1 - левое поддерево (Наследник Three)
$V2 - правое поддерево (Наследник Three)
$n - уровень

Т.е.
1) New Three
и т.д., правда если есть стандартная реализация - лучше воспользоваться ею, подскажите пожалуйста ...

-~{}~ 15.03.10 20:49:

PHP:
<?php

class Treenode {
	public $Node;
	public $LP;
	public $PP;
	public $U;
	public $i;
	public $simbol;
	
	public function __construct($j, $simbol)
	{
		$Node = $simbol;
		$LP=0;
		$PP=0;
	}
	public function CreatePP()
	{
		$PP=1;
	}
	public function CreateLP()
	{
		$PP=1;
	}
	public function SpuskLP()
	{
		$a = 0;
		if ($U[$j-3+$a]->LP=0)
		{
			$U[$j-3+$a]->LP=1; 
		} else
		{
			$a = 1;
			SpuslLP;
		}
		
	}
	public function SpuskLP2()
	{
		$a = 0;
		if ($U[$j-2+$a]->LP=0)
		{
			$U[$j-2+$a]->LP=1;	
			$U[$j] = new TreeList($j, $simbol);
		} else
		{    
			$a = 1;
			function Podspusk()
			{
				if ($U[$j-2-$a]->LP=0) 
				{	
					$U[$j-2-$a]->LP=1;	
					$U[$j] = new TreeList($j, $simbol);
				} else
				Podspusk();
			}
		}
	}}
	
class Treelist {
	public $Node;
	public $simbol;
	public $U;
		public function __construct($j, $simbol)
	{
		$Node=$simbol;
	}
		public function CreatePP()
	{
		$PP=1;
	}
	public function CreateLP()
	{	}
	public function SpuskLP()
	{}
	public function SpuskLP2()
	{}}

$i=0;
ini_set('display_errors',1);
error_reporting(E_ALL);	
$formula='+/ed*-cba';
$dl=strlen($formula);
$simbol=substr($formula,$i,1);
$j=1;
$U[$j] = new Treenode($j, $simbol);
$predoper=1;   // 1 - операция  2 - буква
 for ($i = 1; $i <= $dl-1; $i++)
 {
	 $j++;
	 $simbol = substr($formula,$i,1);
	 switch ($simbol)
	 {
		case "+": case "-": case "/": case "*":
			if ($Predoper=1)
			{
				$U[$j-1]->CreatePP();
				$U[$j] = new Treenode($j, $simbol);
			} else
			{
				SpuskLP;
				$U[$j-1]->CreateLP();
				$U[$j] = new Treenode($j, $simbol);
			}
			$predoper=1;
			break;
			
		case "a": case "b": case "c": case "d": case "e":
			if ($Predoper=1)
			{
				$U[$j] = new TreeList($j, $simbol);
			} else
			{
				SpuskLP2();
			}
			break;
			$predoper=2;
	 }
 }
for ($j=1; $j<10; $j++)
{
	print ($U[$j]->Node);
}
?>

Что-то сделал, алгоритм пока можно не смотреть, ругается, что в строке 81: "Fatal error: Call to a member function CreatePP() on a non-object in H:\home\testfirst.ru\www\index.php on line 81". Насколько я понял он не создает вообще объекты класса, я первый раз с классами работаю в PHP, может я что не так делаю?
 
Спасибо, ползная функция, помогла.
Вроде все отредактировал, но теперь не могу вывести значения на экран:
print ($U[$j]->Node); - Можно ли вообще делать массив из экземпляров класса? Если да, то почему он может не выводить?
 
Сверху