Written by Anonymous

#include<stdio.h>

#define _max_ 1001

typedef struct
{
    int vetor[_max_];
    int iTopo;
}TPilha;

//Inicializar uma Pilha:
void inicializarPilha(TPilha *P) //usando * para passar a referencia
{
    (*P).iTopo = -1;
}

//Finalizar a Pilha: Garante que a pilha termine sempre "vazia"
void finalizarPilha(TPilha *P)
{
    (*P).iTopo = -1;
}

//Vazia: Informar se a pilha está vazia ou não
int vazia(TPilha P)
{
    return P.iTopo == -1; // Se a iTopo for = -1, é true e retornará o valor 1, logo a pilha estará vazia, caso contrário retornara 0.
}

//Cheia: Informa se a pilha está com seu valor máximo ou não.
int cheia(TPilha P)
{
    return P.iTopo == _max_ - 1; //Msm caso do exemplo acima, porém agora o valor a ser comparado é: Max - 1 = 99.
}

//Topo: Informa o valor que está no topo da pilha.
float topo(TPilha P)
{
    return P.vetor[P.iTopo];
}

//Inserir: Insere um valor n pilha.
void inserir(TPilha *P, int valor)
{
    if(cheia(*P))
    {
    }
    else
    {
        (*P).iTopo++;
        (*P).vetor[(*P).iTopo] = valor;
    }
}

//Remover: Remove o elemento que corresponde ao topo da pilha.
void remover(TPilha *P)
{
    if(vazia(*P))
    {
    }
    else
    {
        (*P).iTopo--;
    }
}

int main(){
    
    TPilha A, estacao, B;
    int quantidadeDeTrens, n, i, maior = 0, topoA, topoEstacao;
    
    while(1){
        scanf("%i", &quantidadeDeTrens);
        
        if(quantidadeDeTrens == 0){
            printf("\n");
            break;
        }
        
        while(1){
            inicializarPilha(&A);
            inicializarPilha(&estacao);
            inicializarPilha(&B);
            
            scanf("%i", &n);
            
            if(n == 0){
                printf("\n");
                break;
            }else{
                inserir(&A, n);
                
                if( n > maior)
                    maior = n;
            }
            for(i=0; i < quantidadeDeTrens - 1;i++){
                scanf("%i", &n);
                inserir(&A, n);
                if( n > maior)
                    maior = n;
            }
            
            while(vazia(A) == 0 || (topo(estacao) == maior) ){
                
                if(vazia(A)){
                    topoA = 0;
                }else{
                    topoA = topo(A);
                }
                
                if(vazia(estacao)){
                    topoEstacao = 0;
                }else{
                    topoEstacao = topo(estacao);
                }
                
                if(topoA == maior){
                    inserir(&B, topoA);
                    remover(&A);
                    maior--;
                
                }else if(topoEstacao == maior ){
                    inserir(&B, topoEstacao);
                    remover(&estacao);
                    maior--;
                    
                }else {
                    inserir(&estacao, topoA);
                    remover(&A);
                }
            }
            
            if(vazia(A) == 1 && vazia(estacao) == 1){
                printf("Yes\n");
            }else{
                printf("No\n");
                
            }
            
            finalizarPilha(&A);
            finalizarPilha(&estacao);
            finalizarPilha(&B);
        }
    }
    return 0;
}
Notepad
Select All