fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4.  
  5. // Definição da estrutura para a pilha
  6. typedef struct pilha {
  7. int capacidade;
  8. int topo;
  9. float *itens;
  10. } Pilha;
  11.  
  12. // Função para criar a pilha
  13. Pilha* criarPilha(int capacidade) {
  14. Pilha* pi = (Pilha*) malloc(sizeof(Pilha));
  15. pi->capacidade = capacidade;
  16. pi->topo = -1;
  17. pi->itens = (float*) malloc(pi->capacidade * sizeof(float));
  18. return pi;
  19. }
  20.  
  21. // Função para empilhar
  22. void empilhar(Pilha* pi, float valor) {
  23. if(pi->topo == pi->capacidade - 1) {
  24. printf("Pilha cheia.\n");
  25. } else {
  26. pi->topo++;
  27. pi->itens[pi->topo] = valor;
  28. }
  29. }
  30.  
  31. // Função para desempilhar
  32. float desempilhar(Pilha* pi) {
  33. if(pi->topo == -1) {
  34. printf("Pilha vazia.\n");
  35. return -1;
  36. } else {
  37. float valor = pi->itens[pi->topo];
  38. pi->topo--;
  39. return valor;
  40. }
  41. }
  42.  
  43. // Função para verificar se a pilha está vazia
  44. int pilhaVazia(Pilha* pi) {
  45. if(pi->topo == -1) {
  46. return 1;
  47. } else {
  48. return 0;
  49. }
  50. }
  51.  
  52. // Função para converter expressão para NPR
  53. void converterParaNPR(char expressao[], Pilha* pi) {
  54. int i;
  55. for(i = 0; expressao[i] != '\0'; i++) {
  56. if(isdigit(expressao[i])) {
  57. empilhar(pi, expressao[i] - '0');
  58. } else if(expressao[i] == '+' || expressao[i] == '-' || expressao[i] == '*' || expressao[i] == '/') {
  59. float valor1 = desempilhar(pi);
  60. float valor2 = desempilhar(pi);
  61. switch(expressao[i]) {
  62. case '+':
  63. empilhar(pi, valor2 + valor1);
  64. break;
  65. case '-':
  66. empilhar(pi, valor2 - valor1);
  67. break;
  68. case '*':
  69. empilhar(pi, valor2 * valor1);
  70. break;
  71. case '/':
  72. empilhar(pi, valor2 / valor1);
  73. break;
  74. }
  75. }
  76. }
  77. }
  78.  
  79. // Função para calcular o resultado da expressão em NPR
  80. float calcularResultado(Pilha* pi) {
  81. if(pilhaVazia(pi)) {
  82. printf("Expressão estava errada.\n");
  83. return -1;
  84. } else {
  85. return desempilhar(pi);
  86. }
  87. }
  88.  
  89. // Função principal
  90. int main() {
  91. char expressao[100];
  92. printf("Digite a expressão matemática: ");
  93. scanf("%s", expressao);
  94. Pilha* pi = criarPilha(100);
  95. converterParaNPR(expressao, pi);
  96. float resultado = calcularResultado(pi);
  97. if(resultado != -1) {
  98. printf("Resultado: %.2f\n", resultado);
  99. }
  100. return 0;
  101. }
Success #stdin #stdout 0.01s 5272KB
stdin
Standard input is empty
stdout
Digite a expressão matemática: Expressão estava errada.