#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
// Definição da estrutura para a pilha
typedef struct pilha {
int capacidade;
int topo;
float *itens;
} Pilha;
// Função para criar a pilha
Pilha* criarPilha(int capacidade) {
Pilha
* pi
= (Pilha
*) malloc(sizeof(Pilha
)); pi->capacidade = capacidade;
pi->topo = -1;
pi
->itens
= (float*) malloc(pi
->capacidade
* sizeof(float)); return pi;
}
// Função para empilhar
void empilhar(Pilha* pi, float valor) {
if(pi->topo == pi->capacidade - 1) {
} else {
pi->topo++;
pi->itens[pi->topo] = valor;
}
}
// Função para desempilhar
float desempilhar(Pilha* pi) {
if(pi->topo == -1) {
return -1;
} else {
float valor = pi->itens[pi->topo];
pi->topo--;
return valor;
}
}
// Função para verificar se a pilha está vazia
int pilhaVazia(Pilha* pi) {
if(pi->topo == -1) {
return 1;
} else {
return 0;
}
}
// Função para converter expressão para NPR
void converterParaNPR(char expressao[], Pilha* pi) {
int i;
for(i = 0; expressao[i] != '\0'; i++) {
empilhar(pi, expressao[i] - '0');
} else if(expressao[i] == '+' || expressao[i] == '-' || expressao[i] == '*' || expressao[i] == '/') {
float valor1 = desempilhar(pi);
float valor2 = desempilhar(pi);
switch(expressao[i]) {
case '+':
empilhar(pi, valor2 + valor1);
break;
case '-':
empilhar(pi, valor2 - valor1);
break;
case '*':
empilhar(pi, valor2 * valor1);
break;
case '/':
empilhar(pi, valor2 / valor1);
break;
}
}
}
}
// Função para calcular o resultado da expressão em NPR
float calcularResultado(Pilha* pi) {
if(pilhaVazia(pi)) {
printf("Expressão estava errada.\n"); return -1;
} else {
return desempilhar(pi);
}
}
// Função principal
int main() {
char expressao[100];
printf("Digite a expressão matemática: "); Pilha* pi = criarPilha(100);
converterParaNPR(expressao, pi);
float resultado = calcularResultado(pi);
if(resultado != -1) {
printf("Resultado: %.2f\n", resultado
); }
return 0;
}