Создание программы 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);
}