Ir ao conteúdo
  • Cadastre-se

Pilhas em C


DeadCold

Posts recomendados

Olá gente, sou novo no fórum, criei uma conta aqui para tirar uma dúvida, pretendo postar mais. Estou estudando Estrutura de Dados em C na faculdade e preciso implementar uma pilha em C, comecei a fazer um código utilizando vetores, de início comecei a fazer com struct e ponteiros, mas o professor liberou para fazer com Vetor. Ele quer que seja criada uma calculadora RPN (notação polonesa reversa) usando o conceito de Pilha. Meu código está rodando, porém não funciona, o problema está na hora de inserção de valores na pilha, porém não sei o que é! Ao invés de me retornar o resultado da conta, e/ou inserir um número, simplesmente me retorna uma posição de memória e não o valor que inseri. 

 

#include <stdio.h>
#include <stdlib.h>
 
#define MAXPUSH 10
#define true 1
#define false 0
 
int pilha[MAXPUSH];
int push(int val, int x)
{
if (pilha[0] == NULL)
{
pilha[0] = val;
x++;
}
if (x == MAXPUSH)
{
printf("Overflow!\n\n");
        system("pause");
        exit(1);
    }
    pilha[x]=val;
    x++;
 
    return x;
}
int pop(int x)
{
if(x < 0)
{
printf("Underflow!\n\n");
system("pause");
exit(1);
}
pilha[x] = NULL;
x--;
return x;
}
 
int main()
{
    int status=1;
    int val, op, x;
    printf("Bem-vindo! Calculadora RPN usando conceito de Pilha\n");
    printf("Informe uma opcao:\n");
while (status==1)
    {
        printf("\n\n[1] - Soma\n[2] - Subtracao\n[3] - Multiplicacao\n[4] - Divisão\n[5] - Potenciacao\n[6] - Inserir Numero\n[7] - Sair\n\n");
        printf("Informe o codigo referente ao processo desejado: ");
        scanf("%d",&op);
while (op!= 1 && op!= 2 && op!= 3 && op!=4 && op!=5 && op!=6 && op!=7)
        {
            system("cls");
            printf("Informe uma opcao:\n");
            printf("[1] - Soma\n[2] - Subtracao\n[3] - Multiplicacao\n[4] - Divisao\n[5] - Potenciacao\n[6] - Inserir Numero\n[7] - Sair\nOpcao desejada: ");
            scanf("%d",&op);
        }
        system("cls");
        if (op==1)
        {
            if (x < 2)
            {
                printf("Impossivel realizar operacao!\n\n");
                system("pause");
                system("clear");
                exit(1);
            }
printf("Soma!");
val = pilha[x-1] + pilha[x];
            pop(x);
            pop(x);
push(val, x);
            printf("\n\nValor do resultado: %d",val);
        }
        if (op==2)
        {
            if (x < 2)
            {
                printf("Impossivel realizar operacao!\n\n");
                system("pause");
                system("clear");
                exit(1);
            }
            printf("Subtracao!");
val = pilha[x-1] - pilha[x];
            pop(x);
            pop(x);
push(val, x);
            printf("\n\nValor do resultado: %d",val);
        }
        if (op==3)
        {
            if (x < 2)
            {
                printf("Impossivel realizar operacao!\n\n");
                system("pause");
                system("clear");
                exit(1);
            }
            val = pilha[x-1] * pilha[x];
            pop(x);
            pop(x);
push(val, x);
            printf("\n\nValor do resultado: %d",val);
        }
        if (op==4)
        {
            if (x < 2)
            {
                printf("Impossivel realizar operacao!\n\n");
                system("pause");
                system("clear");
                exit(1);
            }
            printf("Divisao!");
val = pilha[x-1] / pilha[x];
            pop(x);
            pop(x);
push(val, x);
            printf("\n\nValor do resultado: %d",val);
        }
if (op==5)
{
   if (x < 2)
            {
                printf("Impossivel realizar operacao!\n\n");
                system("pause");
                system("clear");
                exit(1);
            }
val = pilha[x-1] ^ pilha[x];
            pop(x);
            pop(x);
push(val, x);
            printf("\n\nValor do resultado: %d",val);
}
if (op==6)
{
printf("Inserir Numero!\n\nInsira um numero na pilha: ");
fflush(stdin);
            scanf("&d",&val);
            push(val, x);
            printf("\n\n");
            system("pause");
            printf("\n\n");
}
if (op==7)
{
printf("Sair!\n\n");
system("pause");
            status = 0;
}
    }
return 0;
system("pause");
}
 
Link para o comentário
Compartilhar em outros sites

Não cheguei a olhar seu código inteiro, mas já percebi um erro:

int main(){    int status=1;    int val, op, x;    printf("Bem-vindo! Calculadora RPN usando conceito de Pilha\n");    printf("Informe uma opcao:\n");    while (status==1)    {        printf("\n\n[1] - Soma\n[2] - Subtracao\n[3] - Multiplicacao\n[4] - Divisão\n[5] - Potenciacao\n[6] - Inserir Numero\n[7] - Sair\n\n");        printf("Informe o codigo referente ao processo desejado: ");        scanf("%d",&op);        while (op!= 1 && op!= 2 && op!= 3 && op!=4 && op!=5 && op!=6 && op!=7)        {            system("cls");            printf("Informe uma opcao:\n");            printf("[1] - Soma\n[2] - Subtracao\n[3] - Multiplicacao\n[4] - Divisao\n[5] - Potenciacao\n[6] - Inserir Numero\n[7] - Sair\nOpcao desejada: ");            scanf("%d",&op);        }        system("cls");        if (op==1)        {            if (x < 2)            {

Está fazendo uma validação para a variável 'x', sem ao menos, tê-la iniciado com um valor válido.
A comparação está sendo feita com lixo em memória, atribuída a variável 'x'.

Link para o comentário
Compartilhar em outros sites

Obrigado BlackScreen, já arrumei o erro, mas mesmo assim, me retorna lixo como memória, estou olhando o código e ainda vejo alguns errinhos, tanto que arrumei. no "if op == 6", meu scanf tá errado :P
acho que meu problema é que preciso retornar 2 valores da minha função push, preciso retornar o valor que inseri, "val", e o "x" que seria como uma variável contadora, para poder andar pela pilha e controlar se houver Overflow ou Underflow. Mudei meu código e aparentemente tá funcionando aos poucos, nas funções os parâmetros são ponteiros, e quando chamo essas funções na main, uso o "&" para conseguir o valor correto da variavel passada. Ficou confuso, mas isso aí. :P
Se conseguir progredir mais, vou postar o código aqui

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