Ir ao conteúdo
  • Cadastre-se

Programa que realiza operações na notação pós-fixada com pilha


Posts recomendados

Olá, tenho que fazer um programa que faça a seguinte expressão: (1-2) * (4+5) 

na notação pós-fixada é igual a:  1 2 - 4 5 + *

Para realizar o cálculo, cada operando é empilhado em uma pilha de valores. Quando se encontra um operador, desempilha0se o número apropriado de operandos, realizando-se a operação devida e empilha0se o resultado.

Desse modo, na expressão citada, são empilhados os valores 1 e 2.

Quando aparece o operador -, 1 e 2 são desempilhados, e o resultado da operação, no caso -1 = (1-2), é colocado no topo da pilha.
A seguir, 4 e 5 são empilhados. O operador seguinte, +, desempilha o 4 e o 5 e empilha o resultado da soma = 9.

Nesse momento estão na pilha os dois resultados parciais, -1 na base e 9 no topo. O operador *, então, desempilha os dois e coloca -9 (= -1 * 9) no topo da pilha.

No que seria possível adaptar o seguinte código para fazer o que está proposto?


#include<stdlib.h>
#include<stdlib.h>
#include<string.h>
 
typedef struct sNo
{
  int valor;
  struct sNo *Prox;
}NO;
 
void inic(NO **Pilha)
{
  *Pilha = NULL;
}
 
void push(NO ** Pilha,int Num)
{
  NO * Tmp;
  Tmp = (NO*)malloc(sizeof(NO));
  if(Tmp==NULL)return;
    Tmp->valor = Num;
    Tmp->Prox=*Pilha;
    *Pilha=Tmp;
}
 
int Empty(NO * Pilha)
{
  return(Pilha == NULL);
}
 
void pop(NO** Pilha)
{
  NO *Tmp =*Pilha;
  
  if(Empty(*Pilha))
    printf("VAZIA");
  *Pilha=(*Pilha)->Prox;
  printf("%i\n", Tmp->valor);
  free(Tmp);
}
 
int list(NO * Pilha)
{
  if(Empty(Pilha))
    return;
  printf("%d ", Pilha->valor);
  list(Pilha->Prox);
}
 
int peek(NO * Pilha)
{
  if(Empty(Pilha))
    return 0;
  printf("%d\n", Pilha->valor);
    return Pilha->valor;
}
 
int main()
{
  int num_comando;
  char string_digitada[50];
  char *comando;
  NO *Pilha=NULL;
  do
  {
    gets(string_digitada);
    comando=strtok(string_digitada," ");
    num_comando=atoi((char*)strtok(NULL, " "));
 
  if(strcmp(comando,"push")==0)
  {
    push(&Pilha,num_comando);
    continue;
  }
  else if(strcmp(comando,"list")==0)
  {
    list(Pilha);
    printf("\n");
   continue;
  }
  else if(strcmp(comando,"pop")==0)
  {
    pop(&Pilha);
   continue;
  }
  else if(strcmp(comando,"peek")==0)
  {
    peek(Pilha);
   continue;
  }
 }
  while(strcmp(comando,"end")!=0);
  system("pause");
  getch();
}
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...