forked from EDA-UNB-FGA/bibliotecas-EDA
-
Notifications
You must be signed in to change notification settings - Fork 0
/
calculadoraexpressoes.c
executable file
·91 lines (82 loc) · 2.22 KB
/
calculadoraexpressoes.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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 101
int main(){
/*vale lembrar que esse algoritmo tem muitas falhas, so resolve o caso onde a equação
tem parenteses ao redor de toda a expressão e os números no cálculo tiverem apenas um dígito
*/
char string[N];
char pilha[N],posfixa[N];
int tampi=0, tampos=0,i;
scanf("%[^\n]s", string);
//para calcular expressões vamos transfomar a equação na notação polonesa e depois usar as filas para calcular o valor da expressão
//transformando em notação posfixa
for(i=0; string[i]!='\0'; ++i){
switch(string[i]){
case '(':
pilha[tampi++]=string[i]; //adiciona todos os '('
break;
case ')':
while(pilha[--tampi]!='(')posfixa[tampos++]=pilha[tampi]; // quando encontrar um ')' desempilha até o '('
//(ordem de precedencia)
break;
case '+':
case '-':
while(pilha[tampi-1]!='(')posfixa[tampos++]=pilha[--tampi]; //quando encontrar um '+' ou um '-'
pilha[tampi++]=string[i]; //desempilhe até o '('
break;
case '/':
case '*':
while(pilha[tampi-1]!='+' && pilha[tampi-1]!='-' && pilha[tampi-1]!='(')posfixa[tampos++]=pilha[--tampi];
pilha[tampi++]=string[i];
/*a precedência do '*' e '/' é maior que a '+' e '-' portanto quando encontrarmos eles
devemos para de desempilhar
*/
break;
default : posfixa[tampos++]=string[i]; //adiciona os digitos
}
}
posfixa[tampos]='\0'; //colocando o terminado na string
printf("%s\n", posfixa);
/*
passamos na posfixa até encontrarmos uma operação,
caso encontre operamos os 2 primeiros elementos da pilha
e retornamos o resultado
*/
int conta[N];
tampi=0;
//calculando resultado
int a,b;
for(i=0; posfixa[i]!='\0'; ++i){
switch(posfixa[i]){
case '+':
tampi--;
a = conta[tampi-1];
b = conta[tampi];
conta[tampi-1]=a+b;
break;
case '-':
tampi--;
a = conta[tampi-1];
b = conta[tampi];
conta[tampi-1]=a-b;
break;
case '/':
tampi--;
a = conta[tampi-1];
b = conta[tampi];
conta[tampi-1]=a/b;
break;
case '*':
tampi--;
a = conta[tampi-1];
b = conta[tampi];
conta[tampi-1]=a*b;
break;
default : conta[tampi++]=(int)(posfixa[i]-'0');
}
}
printf("%d\n", conta[0]);
return 0;
}