// pilhaordena.cpp: Define o ponto de entrada para a aplicação de console.
// ta ai um codigo que ordena
#include "stdafx.h"
#include <iostream>
using namespace std;
struct No {
int conteudo;
No* prox;
};
struct Pilha {
No* topo;
int size;
};
void push(Pilha* p, int valor) {
No* aux = (No*)malloc(sizeof(No));
aux->conteudo = valor;
aux->prox = p->topo;
p->topo = aux;
p->size++;
}
//funcao para desempilhar
int pop(Pilha *pilha) {
char valor; // cria para receber o valor da pilha enquanto faz o desempilhamento
No *aux = NULL; //auxilo para receber o endereço da pilha excluida
if (pilha->size == 0) {
cout << "pilha vazia para retirar" << endl;
return -1;
}
else if((pilha->topo) != NULL) { //testa primeiramente se a pilha esta vazia
aux = pilha->topo->prox; //aux recebe o end da pilha
valor = pilha->topo->conteudo; //valor recebe o conteudo da pilha
free(pilha->topo); //exclui a pilha
pilha->topo = aux; // a pilha que estava embaixo recebeu o "aux" q recebeu o end do topo da pilha;
pilha->size--;
return valor; //retorna o valor desempilhado
}
}
Pilha* criaPilha() {
Pilha* p = (Pilha*)malloc(sizeof(Pilha));
p->topo = NULL;
p->size = 0;
return p;
}
void imprimiPilha(Pilha* p) {
No* aux;
aux = p->topo;
while (aux != NULL) {
cout << aux->conteudo << endl;
aux = aux->prox;
}
}
bool empty(Pilha* p) {
if (p->size == 0) {
return true;
}
else {
return false;
}
}
Pilha* ordenaPilha(Pilha* p, Pilha* p2) {
int elemento;
int max;
int aux = NULL; int c = 0, x = 0;
while (p->topo != NULL) {
max = NULL;
while (p->topo != NULL) {
elemento = pop(p);
if (elemento > max) {
max = elemento;
}
push(p2, elemento);
}
while (p2->size != 0) {
elemento = pop(p2);
//cout << elemento;
if (elemento == max) {
aux = elemento;
}
else {
push(p, elemento);
}
}
push(p2, aux);
p2->size--;
max = aux;
}
return p2;
}
int main()
{
Pilha* p1 = criaPilha();
Pilha* p2 = criaPilha();
push(p1, 2);
push(p1, 1);
push(p1, 4);
push(p1, 3);
imprimiPilha(p1);
cout << endl;
p1 = ordenaPilha(p1, p2);
cout << endl;
imprimiPilha(p1);
system("pause");
return 0;
}