Создание программы RPN, которая включает преобразование постфикса в инфикс. Застрял на попытке построить дерево бинарного поиска

Так что, в основном, я пытаюсь решить эту часть проблемы с помощью bst. Я считаю, что bst - лучший способ сделать это, потому что, попав в дерево, вы можете начинать снизу и идти слева, сверху и справа, и получается выражение infix. Например, если вы берете выражение rpn "5 4 +" и начинаете с конца, "+" является корнем дерева, а левый и правый узлы равны 5 и 4. Затем, если идти слева, сверху и справа вы получите 5 + 4. Спецификации состоят в том, что я должен правильно ставить все в скобки для больших выражений; "5 4 + 3 * 2 /" должно стать "((5 + 5) * 3) / 2".

Моя инфиксная функция сейчас просто распечатывает дерево в линейной форме. Очевидно, что что-то не так с тем способом, которым я пытаюсь построить дерево, потому что "1 5 A" распечатывается как "A 5 5".. на самом деле, независимо от того, что я печатаю, он печатает только три вещи, которые говорят мне, что это только хранение максимум трех вещей. В любом случае, программы в плохом состоянии, которые я чувствую, и я сосу на C, и любая помощь будет принята с благодарностью. Вероятно, есть некоторые очевидные ошибки, но мои мозги слишком жареные, чтобы заметить любую из них. Мои другие занятия в колледже мешают сосредоточиться на программировании.

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>

#define MAX 100;

#define OP_EVAL "-e"
#define OP_INFX "-c"
#define OP_GENI "-g"

struct btree {
  int data;
  int isop;
  struct btree *left; 
  struct btree *right;
};

typedef struct btree node;

int is_oper(char ch);

node*
insert(char** argv, int index){
  node *tree;
  if(index < 1)
    return NULL;
  if(is_oper(argv[index][0])){
    tree = (node*)malloc(sizeof(node));
    tree->data = (int)argv[index][0];
    index--;
    tree->right = insert(argv, index);
    tree->left = insert(argv, index);
    tree->isop = 1;
    return tree;
  }
  else{
    tree = (node*)malloc(sizeof(node));
    tree->right = NULL;
    tree->left = NULL;
    tree->data = atoi(&argv[index][0]);
    tree->isop = 0;
    index--;
    return tree;
  }  
}

enum method
{
  EVAL,
  INFX,
  GENI
};

int 
is_option(const char *str)
{
  return (strcmp(str, OP_EVAL) == 0) ||
         (strcmp(str, OP_INFX) == 0) ||
         (strcmp(str, OP_GENI) == 0);
}

enum method
manip_method(const char *arg)
{
  if (strcmp(arg, OP_EVAL) == 0)
    return EVAL;
  else if (strcmp(arg, OP_INFX) == 0)
    return INFX;
  else if (strcmp(arg, OP_GENI) == 0)
    return GENI;
  else
    return 0;
}

int
is_oper(char ch){
  if(ch == 'A' || ch == 'S' || ch == 'X' || ch == 'D' || ch == 'M')
    return 1;
  else
    return 0;
}

void 
infix(node *root){

  if(root != NULL){
    if(root->isop){
      printf("%c ",(char)root->data);
    }
    else{
      printf("%d ", root->data);
    }
    infix(root->left);
    infix(root->right);
  }
}

int
main(int argc, char *argv[])
{
  node *root;
  root = NULL;
  enum method method;
  int x;
  if (argc >= 4){
    if (is_option(argv[1])){
      if (argc < 5){
    printf("not a valid calculatable expression, exiting now...\n");
    exit (EXIT_FAILURE);
      }
      x = 2;
      method = manip_method(argv[1]);
    }
    else {
      x = 1;
      method = EVAL;
    }
  } else {
    printf("need option and or a valid reverse polish notation expression, exiting now...\n");
    exit (EXIT_FAILURE);
  }

  root = insert(argv, argc-x);

  infix(root);

  exit (EXIT_SUCCESS);

}

0 ответов

Другие вопросы по тегам