НатальяПавлинкович
NegatyLemon
ааа!!! ура, ура! получилось =)
спасибо большое =)
сейчас буду еще со скобками и возведению в степень разбираться =)
спасибо большое =)
сейчас буду еще со скобками и возведению в степень разбираться =)
2+2*2подгляди еще раз откуда слизывала там приоритет операций есть
$stack0[]=$exp0;
switch ($stack0) {
case '+' and '-': return 1; break;
case '*' and '/': return 2; break;
case '^': return 3; break;
}
foreach($expArr as $exp0){
if( is_numeric($exp0)){
$exit[]=$exp0;
} elseif (in_array($exp0, array('*','/','+','-','('))) {
$stack0[]=$exp0;
}
if in_array($exp0, ')'){
while (array_pop($exp0)!='('){
$exit[]=array_pop($exp0);
}
}
}
решать что с этим делать, "либо в отправить $exit либо оставить в $ctack0" либо поместить в стек но в начало, имелось ввиду!мне надо не сразу решать, а посмотреть куда поставить тот или иной знак, либо в отправить $exit либо оставить в $ctack0
тебе и по шагам сложно, поэтому запомним мыслишку про скобки но вернемся к приоритету.а я так могу сделать? что бы скобки работали=)
$exp=$_POST['expression'];
function convert($exp){ //преобразую из инфиксной нотации в ОПН
$expArr=preg_split('#([+\-*/\^()]|\d+)#', $exp, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); //разбить строку на символы
$stack0=array(); //стэк
$exit=array(); // выходная строка
$prev='';
foreach($expArr as $exp0){
//for ($i=0; $i<=count($expArr); $i++)
if( is_numeric($exp0)){
$exit[]=$exp0;
} elseif (in_array($exp0, array('*','/','+','-','('))) {
if (prior($exp0)==1){
$stack0[]=$exp0;
} elseif (prior($exp0)==2) {
if (prior($prev)<2){
$stack0[]=$exp0;
} else {
$exit[]=$prev;
array_pop($stack0);
$stack0[]=$exp0;
}
} elseif (prior($exp0)==3) {
if (prior($prev)<3){
$stack0[]=$exp0;
} else {
$exit[]=$prev;
array_pop($stack0);
$stack0[]=$exp0;
}
$prev=$exp0;
}
}
// if (in_array($exp0, ')')){ // непонятное действие со скобками
// while (array_pop($exp0)!='('){
// $exit[]=array_pop($exp0);
// }
// }
}
$exprArray=array_merge($exit, array_reverse($stack0));
$expr=implode(" ", $exprArray);
return $expr;
}
echo 'RESULT='.convert($exp);
function prior($stack0){
switch ($stack0) { // пытаюсь расставить приоритеты
case '(': return 1; break;
case '+' and '-': return 2; break;
case '*' and '/': return 3; break;
case '^': return 4; break;
// case '^': return 4; break;
default: return 0;
}
}