Оцените выражение Postfix, используя дерево в C ++

0

Я должен оценивать постфиксное выражение, используя дерево выражений. Предположим, у меня есть дерево, подобное этому

    -
   / \
  +   *
 / \  / \
a  b  c  d

Сначала мне нужно оценить поддерево + b и сохранить его результат в + узле, затем c * d и так далее, пока я не получу результат в корневом узле.

Я попробовал рекурсивный подход, используя стек, но это не сработало. Псевдокод выглядел так

  1. функция eval (node)
  2. Eval (node-> слева)
  3. Eval (node-> справа)
  4. если (узел является листовым узлом), нажмите его в стеке
  5. else if (node - это операнд) pop a и pop b из стека node-> value = a-> значение op b-> значение delete ab;

Однако это не сработало. Я также должен показать дерево на каждом шаге, чтобы показать уменьшающиеся узлы. Я много раз искал его, но я не смог найти нужный ответ. Кто-нибудь, пожалуйста, помогите мне, как это сделать.

void expression_tree::evaluate(node *temp)
{
    if(!temp)
    return;
/// stack_postfix obj;
    stack_postfix obj2;
    evaluate(temp->left);
    evaluate(temp->right);
        if(temp->right == NULL && temp->left == NULL)
        {
            obj2.push(temp);
        }
        else
        {
            node * a = obj2.pop();
            node *b = obj2.pop();
            temp->value = a->value + b->value;
            delete a;
            delete b;
        }

}

  • 2
    Что именно не сработало? Пожалуйста, покажите соответствующий код и опишите точно, что не сработало.
  • 0
    Вы должны поместить полученное значение в стек на шаге 5
Показать ещё 2 комментария
Теги:
expression-trees
postfix-notation

2 ответа

0
Лучший ответ

у вас есть 2 варианта:

eval листа:

1 - просто нажмите значение для стека

eval of non_leaf:

1 - eval left, - ПОМНИТЕ: результат eval добавлен в стек.

2 - справа,

3 - поп 2 предмета,

4 - расчет,

5 - нажмите результат.

в конце у вас будет 1 элемент в стеке - последний результат

РЕДАКТИРОВАТЬ:

void expression_tree::evaluate(node *temp, stack& s)
{
   if(!temp)
      return;

   if(temp->left != NULL && temp->right  != NULL){
       //only 1 pointer is illegal!
       evaluate(temp->left);
       evaluate(temp->right);
       node* n2 = s.pop();
       node* n1 = s.pop();
       //in the stack should be only leaves
       temp->value = n1->value + n2->value;//use switch by operator 
       delete temp->left; 
       temp->left = NULL;
       delete temp->right; 
       temp->right=NULL;
   }
   s.push (temp);
}
0

Вы забыли obj2.push(temp->balue); в другой части

Однако, есть больше ошибок, стек должен быть разделен между вызовами функций, поэтому функция может фактически обработать его

  • 0
    Я также попробовал тот же подход, используя итеративный метод, но у меня это тоже не сработало. Я просто хочу знать, является ли подход, который я пытаюсь использовать, правильным или нет. И есть ли другой способ сделать это?
  • 0
    Ваш подход на основе стека является правильным, за исключением некоторых деталей и немного неясной реализации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню