Ir ao conteúdo
  • Cadastre-se

C++ Como reverter uma pilha?


Tony Soprano
Ir à solução Resolvido por JorgeGus,

Posts recomendados

Dada uma sequência contendo N números reais em uma pilha, escreva uma função que imprima

a ordem reversa dessa pilha.

 

Pessoal, ao tentar reverter a pilha, os números estão saindo como inteiros e não como reais, aqui está o meu código em C++:

#include <iostream>
#include <windows.h>
 
using namespace std;
/* Dada uma sequência contendo N números reais em uma pilha, escreva uma função que imprima
a ordem reversa dessa pilha. */

#define MAXTAM 3

typedef struct {
    float item[MAXTAM]; // [0, 1, 2, 3...]
    int topo;
} TPilha;
 
void TPilha_Inicializa(TPilha *pilha);
int TPilha_Vazia (TPilha *pilha);
int TPilha_Cheia (TPilha *pilha);
void TPilha_Empilha (TPilha *pilha, float x);
int TPilha_Desempilha (TPilha *pilha);
int TPilha_Imprime(TPilha *pilha);
void Reverte (TPilha *pilha, TPilha *pilhaR, float aux);

int main() {
  UINT CPAGE_UTF8 = 65001;
  UINT CPAGE_DEFAULT = GetConsoleOutputCP();
  SetConsoleOutputCP(CPAGE_UTF8);
 
  TPilha pilha, pilhaR;
  float aux;

  TPilha_Inicializa(&pilha);
  TPilha_Empilha(&pilha, 2.8);
  TPilha_Empilha(&pilha, 4.4);
  TPilha_Empilha(&pilha, 11.5);

  cout << "Pilha: ";
  TPilha_Imprime(&pilha);

  cout << "\n\nRevertendo pilha..." << endl;
  Sleep(1500);
  Reverte(&pilha, &pilhaR, aux); // Reverte os elementos da pilha
  cout << "\n\nPilha reversa: ";
  TPilha_Imprime(&pilhaR);
  
  cout << endl << endl;
  system("pause");
  return 0;
}

void TPilha_Inicializa(TPilha *pilha) {
    pilha->topo = -1; // Indica que a pilha está inicializada e vazia
}

int TPilha_Vazia (TPilha *pilha) {
    if (pilha->topo == -1) {
        return 1; // Verdadeiro, a pilha está vazia
    } else {
        return 0; // Falso, a pilha contém elementos
    }
}

int TPilha_Cheia (TPilha *pilha) {
    if (pilha->topo == MAXTAM-1) {
        return 1; // Verdadeiro, pilha cheia
    } else {
        return 0; // Falso, pilha não está cheia
    }
}

void TPilha_Empilha (TPilha *pilha, float x) {
    if (TPilha_Cheia(pilha) == 1) {
        cout << endl << "Pilha cheia!" << endl;
    } else {
        pilha->topo++;
        pilha->item[pilha->topo] = x;
    }
 }

 int TPilha_Desempilha (TPilha *pilha) {
     float aux;
     if (TPilha_Vazia(pilha) == 1) {
         cout << "\nImpossível desempilhar. Pilha vazia" << endl;
     } else {
         aux = pilha->item[pilha->topo];
         pilha->topo--;
         return aux;
     }
 }

 int TPilha_Imprime(TPilha *pilha) {
     if (TPilha_Vazia(pilha) == 1) {
         cout << "\nPilha vazia" << endl;
         return 0;
     } else {
         for (int i=pilha->topo; i>=0; i--) {
            if (i == pilha->topo) {
                cout << endl << "Topo-> " << pilha->item[i] << endl;
            } else {
                 cout << " \t" << pilha->item[i] << endl;
            }     
        } 
     }  
 }

 void Reverte (TPilha *pilha, TPilha *pilhaR, float aux) { // Desempilha os números da pilha 1 e empilha na pilha 2, assim deixando-a reversa
     TPilha_Inicializa(pilhaR);
     aux = TPilha_Desempilha(pilha);
     TPilha_Empilha(pilhaR, aux);
     aux = TPilha_Desempilha(pilha);
     TPilha_Empilha(pilhaR, aux);
     aux = TPilha_Desempilha(pilha);
     TPilha_Empilha(pilhaR, aux);
 }

Alguém consegue identificar o problema?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Cara faz 20mil anos que não programo mais. Mas me bateu um saudosismo. ❤️ Assim não vou poder te ajudar, mas o que eu fazia quando a coisa ta dando ruim identificar onde o seu "pilha" está deixando de ser real "float" e passa a ser inteiro ou "integer" , faça isso dando um print no conteúdo da variável e fazendo uma pausa forçada no programa. Quando identificar as linhas do código que muda fica mais fácil de depurar, parece meio rude mas pode crê você mesmo pode consertar. Boa sorte

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • Solução

@Tony Soprano Tem um pequeno errinho.

 

int TPilha_Desempilha (TPilha *pilha);

deveria ser

float TPilha_Desempilha (TPilha *pilha);

 

E o tipo de retorno na implementação da função também precisa ser mudado.

De resto parece que está funcionando que é uma beleza.

  • Obrigado 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

agora, JorgeGus disse:

@Tony Soprano Tem um pequeno errinho.

 

int TPilha_Desempilha (TPilha *pilha);

deveria ser

float TPilha_Desempilha (TPilha *pilha);

 

E o tipo de retorno na implementação da função também precisa ser mudado.

De resto parece que está funcionando que é uma beleza.

Era isso mesmo, não tinha percebido kkk. Valeu cara!!

@Danis Barsant

agora, Danis Barsant disse:

Cara faz 20mil anos que não programo mais. Mas me bateu um saudosismo. ❤️ Assim não vou poder te ajudar, mas o que eu fazia quando a coisa ta dando ruim identificar onde o seu "pilha" está deixando de ser real "float" e passa a ser inteiro ou "integer" , faça isso dando um print no conteúdo da variável e fazendo uma pausa forçada no programa. Quando identificar as linhas do código que muda fica mais fácil de depurar, parece meio rude mas pode crê você mesmo pode consertar. Boa sorte

obrigado pela força

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!