/
ex_3-conversor-de-equacao-polonesa.c
149 lines (142 loc) · 3.55 KB
/
ex_3-conversor-de-equacao-polonesa.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
//pos ordem pra polonesa inversa
#include <stdio.h>
#include <stdlib.h>
struct arvore //cada entrada da equacao sera um no da arvore
{
char entrada[1];
struct arvore *esq;//cada no aponta para outros dois
struct arvore *dir;
};
/* A impressoo Em Ordem eh utilizada para a impressao da notacao infixa*/
void emordem(struct arvore*no)
{
if(no!=NULL)
{
emordem(no->esq);
if (no->entrada[0] >= 48 && no->entrada[0] <=57)
printf("(");
printf("%s", no->entrada);
if (no->entrada[0] >= 48 && no->entrada[0] <=57)
printf(")");
emordem(no->dir);
}
}
/* A impressao Pos Ordem eh utilizada para a impressao da notacao RNP*/
posordem(struct arvore *lista)
{
if(lista != NULL)
{
posordem(lista->esq);
posordem(lista->dir);
printf("%s ", lista->entrada);
}
}
/*A funcao insertsign insere apenas os operadores da equacao na arvore,
todos sao inseridos a esquerda*/
void insertsign(struct arvore *no, char *k)
{
struct arvore *aux = no;
struct arvore *novo = (struct arvore *)malloc(sizeof(struct arvore));
novo->esq = NULL;
novo->dir = NULL;
strcpy(novo->entrada, k);
while (aux->esq != NULL)
{
aux = aux->esq;
}
aux->esq = novo;
}
/*a funcao insertnum insere os numeros da equacao na arvore, sendo o prieiro
deles a esquerda do uktimo sinal, o segundo a direita do ultimo sinal, e os demais
numeros (n > 2) a direita de seus respectivos operadores */
void insertnum(struct arvore *no, char *k, int n, int i)
{
int count = 1;
struct arvore *aux = no;
struct arvore *a = NULL;
struct arvore *novo = (struct arvore *)malloc(sizeof(struct arvore));
novo->esq = NULL;
novo->dir = NULL;
strcpy(novo->entrada, k);
if (n == 1)
{
while (aux->esq != NULL)
{
aux = aux->esq;
}
aux->esq = novo;
}
else if (n == 2)
{
while (count < i)
{
aux = aux->esq;
count++;
}
aux->dir = novo;
}
else if (n > 2)
{
while (no->dir == NULL)
{
if (aux->esq->esq != NULL && aux->esq->dir != NULL && aux->dir == NULL)
{
aux->dir = novo;
break;
}
else
aux = aux->esq;
}
}
}
int main()
{
struct arvore *raiz = NULL;
int i = 1, j = 1, k, escolha;
char a[1], b[1];
printf("Ola! Este programa ira converter uma entrada em notacao polonesa para a notacao polonesa reversa (RPN) e infixa.\n");
printf("Digite sua equacao em notacao polonesa\n(separe os simbolos e numeros todos por um 'espaco' e depois tecle 'Enter'):\n");
raiz = (struct arvore *)malloc(sizeof(struct arvore)); // cria a raiz
raiz->esq = NULL; //aterra a raiz
raiz->dir = NULL;
scanf("%s", a);
strcpy(raiz->entrada, a);
scanf("%s", a);
while(a[0] == 42 || a[0] == 43 || a[0] == 45 || a[0] == 47) //enquanto sao entrados sinais, cahama a funcao insertsign
{
insertsign(raiz, a);
scanf("%s", a);
i++;
}
insertnum(raiz, a, j, i); //quando sao inseridos numeros, passa a chamar a funcao insertnum
for (j = 2; j < i + 2; j++)
{
scanf("%s", a);
insertnum(raiz, a, j, i);
}
while (escolha != 3) //repete o menu ate que seja escolhida a opcao "sair"
{
printf("\n\nO que voce deseja fazer? Digite o numero correspondente!\n");
printf("1 - Impressao na notacao polonesa reversa (RPN)\n2 - Impressao na notacao infixa\n3 - Sair\n\n");
scanf("%d", &escolha);
if (escolha > 3 || escolha <1) //caso seja escolhida uma opcao fora do menu, uma mensagem de erro eh impressa
{
printf("Favor entrar com uma das opcoes do menu.\n");
}
else
{
switch(escolha)
{
case 1:
printf("\nPolonesa reversa:\n");
posordem(raiz);
break;
case 2:
printf("\nNotacao infixa:\n");
printf("(");
emordem(raiz);
printf(")");
}
}
}
}