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

baev

‹°°¬•
Команда форума
Только мне кажется, что ТС-у preg_match нужна?
 

dimagolov

Новичок
baev, смотря где. еще ему может быть полезен in_array. но это пока для него слишком сложно.
 

Вурдалак

Продвинутый новичок
Ну вообще, автору скорее нужно на token'ы сразу строку разбить и всё.
 

craz

Нестандартное звание
Автор оригинала: Beavis
зачем тут паттерны? ему же посоветовали использовать сравнение "<" ">"
может затем, чтобы уметь решать задачи не одним способом?
 

Beavis

Banned
а, ну давайте, несмотря на то, что он не умеет работать со строками, научим пользоваться регулярными выражениями! отличная идея!
 

craz

Нестандартное звание
Автор оригинала: Beavis
а, ну давайте, несмотря на то, что он не умеет работать со строками, научим пользоваться регулярными выражениями! отличная идея!
ну он же имеет право хотя бы знать о них) он когда их увидит, скорее всего не полезет разбираться, а вообще регулярки они ж не только в php.
 

Seregarival

Новичок
Посмотрел что такое регулярные выражения и принципы работы с ними, на мой взгляд именно эту задачу они немного усложнят, хотя возможно я ошибаюсь (но позже обязательно для общего развития придумаю себе задачу с ними). Дело в том что как таковой шаблон какой-либо строки здесь задать сложно, по крайней мере так, чтоб потом было удобнее его обрабатывать (конечно, мое мнение новичка может быть ошибочным).

Появился вопрос и нигде не могу найти ответ - есть ли в PHP функция по типу goto , В программе появился вложенный switch..case, break выкидывает из одного switch..case, и продолжает проходить по циклу, а мне надо чтобы в определенное время он вышел из обоих ...
 

dimagolov

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

Seregarival

Новичок
Всем спасибо огромное! Первый скрипт готов! (пока без поддержки скобок, чуть позже сделаю). Какие-то навыки уже приобрел :)

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

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 +"
 

Seregarival

Новичок
У нас наверное разные подходы :)
По крайней мере нас учили, что если приоритет текущей операции = приоритету предыдущей, то его тоже в стек ...


Есть вариант с рабочими скобками и автоматической генерацией выражения, только файлы почему-то нельзя прикреплять ...
 

Вурдалак

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

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

Seregarival

Новичок
У меня новое задание :) Теперь хочу вывести дерево разбора, используя полученную польскую запись.

Придумал такой алгоритм:
Читаем Польскую запись сзада наперед:
Первый знак - всегда операция - помещаем в корень
Далее Читаем след исмвол:
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, может я что не так делаю?
 

Seregarival

Новичок
Спасибо, ползная функция, помогла.
Вроде все отредактировал, но теперь не могу вывести значения на экран:
print ($U[$j]->Node); - Можно ли вообще делать массив из экземпляров класса? Если да, то почему он может не выводить?
 
Сверху