преобразование записи из инфиксной в польскую обратную нотацию

WMix

герр M:)ller
Партнер клуба
я понял что с википедии, тебе все в первом посте ответили,
вот, прочти все еще разок, про дебаг не забудь, подумай, попробуй, если что обращайся!

подсказка, гдето тут придется добавить приоритеты операций
PHP:
$stack0[]=$exp0;
и порою использовать эту функцию
http://www.php.net/manual/ru/function.array-unshift.php
 
а я так могу сделать? что бы скобки работали=)
PHP:
    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);
            }
        }
    }
 

WMix

герр M:)ller
Партнер клуба
мне надо не сразу решать, а посмотреть куда поставить тот или иной знак, либо в отправить $exit либо оставить в $ctack0
решать что с этим делать, "либо в отправить $exit либо оставить в $ctack0" либо поместить в стек но в начало, имелось ввиду!
а я так могу сделать? что бы скобки работали=)
тебе и по шагам сложно, поэтому запомним мыслишку про скобки но вернемся к приоритету.
 
надо писать циклом, что-то типо, если приоритет этого знака больше, чем приоритет предыдущего, то выталкиваем предыдущий знак, а этот кладем в стек?
 

WMix

герр M:)ller
Партнер клуба
нужно помнить предыдуший приоритет!
 
WMix
я что-то очень запуталась и даже не знаю где что записывать по приоритетам.... создавать новую переменную для приоритета? и потом сравнивать в самом цикле, который кладет оператора в стэк?
распутай меня, плиз =)
 

WMix

герр M:)ller
Партнер клуба
да както так а дальше в зависимости от результата сравнения сделать выбор из
либо в отправить $exit, либо оставить в $ctack0, либо поместить в стек но в начало, либо взять из стека $ctack0 и положить в $exit
 
получилось так, если расставлять приоритеты... считает правильно, но проблемка с возведением в степень и скобками остаються(
и мне кажеться что переобозначения на prev не правильное =(
PHP:
$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;
    }
}
 
Сверху