Exemple #1
0
    // Método que retorna o item do topo da pilha
	T topo() {
	  if (PilhaVazia()) {
        throw "Pilha Vazia";
      } else {
        return head->getInfo();
	  }
	}
Exemple #2
0
/* Desempilha um elemento, enviando uma mensagem de erro caso a pilha esteja
 * vazia.
 */
ElemPilha* VerificaDesempilha(Pilha* pilha) {
	if (PilhaVazia(pilha)) {
		IMPRIME_ERRO(MSG_ERRO_FALTA_OPERANDO);
	}

	return (ElemPilha*) Desempilha(pilha);
}
 T desempilha() {
     if (PilhaVazia()) {
         throw std::runtime_error("Erro pilha vazia");
     } else {
        return ListaEnc<T>::retiraDoInicio();
     }
 }
 T topo() {
     if (PilhaVazia()) {
         throw std::runtime_error("Erro pilha vazia.");
     } else {
         return ListaEnc<T>::getHead()->getInfo();
     }
 }
Exemple #5
0
		/** Função desempilha
		 *  Se a pilha não estiver vazia, então diminui o número do topo.
		 *	Não há o processo de apagar o dado desempilhado da pilha.
		 *  Verifica o status da pilha através da função PilhaVazia.
		 *  Se houver problema na verificação, redireciona a execução para
		 *  	lugar nenhum.
		 *  Não possui parâmetro.
		 *  Retorna o tipo genérico que representa o dado retirado da pilha.
		 */
		T desempilha() {
			if (PilhaVazia()) {
				throw "problema";
			} else {
				numeroTopo -= 1;
				return dados[numeroTopo + 1];
			}
		}
Exemple #6
0
ElemPilha* VerificaDesempilha(Pilha* pilha) {
/* Desempilha um elemento, enviando uma mensagem de erro caso a pilha      */
/* esteja vazia.                                                           */
  if (PilhaVazia(pilha)) {
    IMPRIME_ERRO(MSG_ERRO_FALTA_OPERANDO);
    return NULL;
  }
  return (ElemPilha*) Desempilha(pilha);
}
Exemple #7
0
    // Método para desempilhar um dado
	T desempilha() {
      if (PilhaVazia())
        throw "Pilha Vazia";
      Elemento<T> *temp = head;
	  T aux = temp->getInfo();
	  head = head->getProximo();
	  temp->~Elemento();
	  --size;
	  return aux;
    }
int main(){
	Pilha s;
	char aux;
	//char inf[] = "(a-b)/(c+d)*e";
	char inf[] = "A^B*C-D+E/F/(G-H)";
	int i = 0;
		
	inicPilha(&s);
	for(i = 0; i < strlen(inf); i++) {
		//printf("%c", inf[i]);
		switch(inf[i]) {
			case '(': push(&s, inf[i]); break;
			case '*':
			case '+':
			case '/':
			case '-':
			case '^':
				while(!PilhaVazia(&s) && verificaPrec(elemTopo(&s), inf[i]) &&
						elemTopo(&s) != '(')
					printf("%c", pop(&s));
				push(&s, inf[i]);
				break;
			case ')': 
				aux = pop(&s);
				while(aux != '('){
					printf("%c", aux);
					aux = pop(&s);
				}
				break;
			default: printf("%c", inf[i]);
				break;
		}
		
	}
	while(!PilhaVazia(&s))
		printf("%c", pop(&s));
		

	printf("\n");

	return 0;
}
Exemple #9
0
	/*!
	\return as informações do elemento retirado da pilha
	\sa empilha(), topo()
	*/
	void desempilha() {
		Elemento<T> *aux;
		if (PilhaVazia()) {
			throw "pilha vazia";
		} else {
			aux = top;
			size--;
			top = aux-> getProximo();
			delete aux;
		}
	}
void inverte_string(char * str){
	
	int i=0;
	
	do{
		push(s,str[i]);				
	}while(str[i++]!='\0');
	
	do{
		printf("%c",pop(s));
	}while(!PilhaVazia());
			
}
Exemple #11
0
/* Retorna o polinômio referente à expressão dada; este polinômio devolvido é
 * sempre uma nova cópia, mesmo que a expressão seja uma variável simples.
 */
Polinomio CalcExpr(char* expr) {
	Pilha polPilha;
	ElemPilha *r;
	Polinomio p;
	int i;

	CriaPilha(&polPilha);

	i = 0;
	while (expr[i] != '\0') {
		if (Operando(expr + i)) {
			EmpilhaOperando(&polPilha, RecuperaPolinomio(expr[i]), false);
		} else if (Operador(expr + i)) {
			ExecutaOperacao(&polPilha, expr[i]);
		} else {
			IMPRIME_ERRO(MSG_ERRO_CARACTERE_INVALIDO);
		}

		i++;
	}

	r = VerificaDesempilha(&polPilha);

	if (!PilhaVazia(&polPilha)) {
		IMPRIME_ERRO(MSG_ERRO_FALTA_OPERADOR);
	}

	if (r->temp) {
		p = r->poli;
	} else {
		p = CopiaPolinomio(r->poli);
	}

	FREE(r);

	return p;
}
Exemple #12
0
		/** Função getter para a posição do topo
		 *  Se a pilha não estiver vazia, retorna a posição do elemento no topo
		 *  	da pilha.
		 *  Verifica o status da pilha através da função PilhaVazia.
		 *  Se houver problema na verificação, redireciona a execução para
		 *  	lugar nenhum.
		 *  Não possui parâmetro.
		 */
		int getPosTopo() {
			if (PilhaVazia())
				throw "problema";
			else
				return numeroTopo;
		}
Exemple #13
0
	/*!
	\sa PilhaEnc(), ~PilhaEnc(), PilhaVazia()
	*/
	void limparPilha() {
		while (!PilhaVazia()) {
			desempilha();
		}
	}
Exemple #14
0
	/*!
	\return informações do elemento no topo da pilha
	\sa empilha(), desempilha()
	*/
	T topo() {
		if (PilhaVazia()) {
			throw "Pilha Vazia";
		}
		return top->getInfo();
	}
Exemple #15
0
void* Desempilha (Pilha* p) {
/* Desempilha um elemento da pilha.                                        */ 
  if (PilhaVazia(p))
    IMPRIME_ERRO(MSG_ERRO_PILHA_VAZIA);
  return p->vetor[p->topo--];
}
Exemple #16
0
Polinomio CalcExpr(char* expr) { 
/* Retorna o polinômio referente à expressão dada.                       */
/* O polinômio devolvido é sempre uma nova cópia, mesmo que a            */
/* expressão seja uma variável simples.                                  */
    Pilha operacao;
    ElemPilha *aux1, *aux2;
    Polinomio temp;
    
    CriaPilha(&operacao);
    printf("Comeca a CalcExpr\n");
    /*Faz a leitura da expressão dada, termo por termo, até chegar no final da linha*/
    while(*expr != '\0'){
        /*Caso a entrada seja um operador*/
        if(!Operando(*expr)){ 
            printf("Operando\n");
            /*Caso o operador seja binário*/
            if(*expr == '+' || *expr == '-' || *expr == '*'){
                /*Como é um operador, deve-se utilizar os dois elementos do topo da pilha*/
                aux1 = VerificaDesempilha(&operacao);
                aux2 = VerificaDesempilha(&operacao);
                
                
                /*Caso tente desempilhar mas a pilha ja esta vazia, entao falta operandos*/
                if(aux1 == NULL || aux2 == NULL){
                    IMPRIME_ERRO(MSG_ERRO_FALTA_OPERANDO);
                }
                
                /*Faz a operacao entre os dois elementos desempilhados*/
                if(*expr == '+'){
                    printf("Soma\n");
                    temp = SomaPolinomios(aux2->poli, aux1->poli);
                }
                else if(*expr == '-'){
                    printf("Sub\n");
                    temp = SubPolinomios(aux2->poli, aux1->poli);
                }
                else if(*expr == '*'){
                    printf("Multi\n");
                    temp = MultPolinomios(aux2->poli, aux1->poli);
                }
                
                /*Empilha o elemento resultante das operacoes*/
                EmpilhaOperando(&operacao, temp, true);
                
                
                /*Libera os elementos da pilha utilizados*/
                if(aux1->temp == true){
                    LiberaPolinomio(aux1->poli);
                }
                if(aux2->temp == true){
                    LiberaPolinomio(aux2->poli);
                }
                
                FREE(aux1);
                FREE(aux2);
            }
            /*Caso o operador seja unário*/
            else if(*expr == '~'){
                /*Como é um operador unario, só é nescessario usar o elemento do topo
                  da pilha*/
                aux1 = VerificaDesempilha(&operacao);
                
                temp = MultTermo(aux1->poli, 0, -1.0);
                EmpilhaOperando(&operacao, temp, true);
                
                /*Desaloca a memoria nescessaria*/
                if(aux1->temp == true){
                    LiberaPolinomio(aux1->poli);
                }
                
                FREE(aux1);
            }
            /*Se não entrou em nenhum dos outros casos, a entada é invalida*/
            else{
                IMPRIME_ERRO(MSG_ERRO_CARACTERE_INVALIDO);
            }
            
        }        
        /*Se a entrada  não for um operador, é um polinomio*/
        else{
            printf("Operador\n");
            /*Empilha o elemento apontado na pilha operacao*/
            EmpilhaOperando(&operacao, vetorPoli[*expr - 'A'], false);
        }
        
        /*Avança a leitura*/
        expr++;    
    }
    /*Depois de terminar de ler as operacoes retira o ultimo elemento e verifica se
      a pilha está vazia, se sim, é por que completou as operacoes corretamente, entao
      retorna esse polinomio
    */
    aux1 = VerificaDesempilha(&operacao);
    
    if(PilhaVazia(&operacao)){
        temp = aux1->poli;
        /*Cria um novo polinomio para poder ser retornado caso o elemento retornado seja 
          uma das 5 bases*/
        if(aux1->temp == false){
            temp = MultTermo(aux1->poli, 0, 1.0);
        }
        
        /*Desaloca o ultima elemento da pilha*/
        FREE(aux1);

        return temp;
    }else{
        /*Se a pilha ainda conter algum elemento*/
        IMPRIME_ERRO(MSG_ERRO_FALTA_OPERADOR);
    }
}
Exemple #17
0
		/** Função topo
		 *  Se a pilha não estiver vazia, retorna o tipo genérico que
		 *  	representa o dado no topo da pilha.
		 *  Verifica o status da pilha através da função PilhaVazia.
		 *  Se houver problema na verificação, redireciona a execução para
		 *  	lugar nenhum.
		 *  Não possui parâmetro.
		 */
		T topo() {
			if (PilhaVazia())
				throw "problema";
			else
				return dados[numeroTopo];
		}