Exemplo n.º 1
0
//Função para verificar na pilha o estado
int VerificacaoPilha(Stack* Pilha,char* x)
{
   int i,resposta;
   char ValorRemovido;
   char Valor_top;
   int n = strlen(x);

   i = 0;

   while(i < n)
   {
         if(x[i] == ')')
        {
            peek(Pilha,&Valor_top);
            if (sizeStack(Pilha) != 0 && Valor_top == '(')
                pop(Pilha,&ValorRemovido);
            else
            {
                clearStack(Pilha);
                return 0;
            }
        }
        else if(x[i] == ']')
        {
            peek(Pilha,&Valor_top);
            if (sizeStack(Pilha) != 0 && Valor_top == '[')
                pop(Pilha,&ValorRemovido);
            else
            {
                clearStack(Pilha);
                return 0;
            }
        }
        else if(x[i] == '}')
        {
            peek(Pilha,&Valor_top);
            if (sizeStack(Pilha) != 0 && Valor_top == '{')
                pop(Pilha,&ValorRemovido);
            else
            {
                clearStack(Pilha);
                return 0;
            }
        }
        else if (x[i] == '(' || x[i] == '[' || x[i] == '{')
            push(Pilha,x[i]);
        i++;
   }
   if (sizeStack(Pilha) == 0)
        resposta = 1;
   else
        resposta = 0;

   clearStack(Pilha);
   return resposta;

}
Exemplo n.º 2
0
Arquivo: eval.c Projeto: dougvk/CS223
// ------------------------------------------------------------ Print operands stack
void printAnds( const Stack Ands )
{
  Iter si = newIter( Ands );

  printf( "\nStack has %d items: bottom<[ ", sizeStack( Ands ) );
  while (hasNextIter( si )) {
    printOperand( nextIter( si ) );  
  }
  printf( "  ]>top\n" );

  freeIter( si );
}
Exemplo n.º 3
0
int main() {
	Stack *s;
	int i, removed, returned, e=5;

	s = createStack();
	initializeStack(s);
	for (i=0; i<10; i++)
	{
		if(push(s, 5+i+1) == true)
		{
		printf("O valor %d foi inserido!\n", 5+i+1);
		}
		else
		{
		printf("O valor %d não pôde ser inserido.\n", 5+i+1);
		}
	}

	for (i=0; i<7; i++)
	{
		if (pop(s, &removed)==true)
		{
			printf("Topo removido com sucesso, o valor era: %d\n", removed);
		}
		else
		{
			printf("Não foi possível remover o topo\n");
		}
	}

	if (top(s, &returned) == true)
	{
		printf("O valor do topo é: %d\n", returned);
	}
	else
	{
		printf("Não há nada no topo.\n");
	}
	
	printStack(s);

	if (containsStack(s, &e) == false)
	{
		printf("O valor 5 não está presente na pilha.\n");
	}
	else
	{
		printf("O valor 5 está presente na pilha.\n");
	}

	e++;
	if (containsStack(s, &e) == false)
	{
		printf("O valor 6 não está presente na pilha.\n");
	}
	else
	{
		printf("O valor 6 está presente na pilha.\n");
	}

	printf("Tamanho da pilha: %d\n",sizeStack(s));

	if (isEmptyStack(s) == true)
	{
			printf("A pilha está vazia.\n");
	}
	else
	{
		printf("A pilha não está vazia.\n");
	}
return(0);	
}
Exemplo n.º 4
0
Arquivo: eval.c Projeto: dougvk/CS223
// -------------------------------- Evaluate all higher precedence operators on stack.
void forceEval( Eval ev, int rprec ) {		
  while( sizeStack( ev->Ators ) > 0 && 
         precedenceOperator( (const Operator) topStack( ev->Ators ) ) >= rprec ) {
    dispatchEval( ev );
  }
}
Exemplo n.º 5
0
Arquivo: eval.c Projeto: dougvk/CS223
//------------------------------------------------ Read input and evaluate expression.
double evaluateEval(Eval ev) {
	Intype next; // Classification of next input character.
	char inSymbol; // Read input operators into this.
	Operator inOp; // Operator object constructed from inSymbol.
	double inNumVal; // Read input operands into this.
	Operand And; // Operand value
	int numread;
	int n;

	for (;;) {
		next = classifyEval(ev);
		switch (next) {
		case number:
			n = sscanf(ev->instream, "%lg%n", &inNumVal, &numread);
			ev->instream += numread;
			if (n!=1 || sizeStack(ev->Ands) != ev->numbin)
				return expErrorEval(ev);
			And = newOperand(inNumVal);
			pushStack(ev->Ands, And);
			break;

		case op:
			if (sizeStack(ev->Ands) != ev->numbin+1)
				return expErrorEval(ev);
			inSymbol = *(ev->instream++);
			inOp = newOperator(inSymbol);
			forceEval(ev, precedenceOperator(inOp) );
			pushStack(ev->Ators, inOp);
			ev->numbin++;
			break;

		case lpar:
			if (sizeStack(ev->Ands) != ev->numbin) return expErrorEval(ev);
			inSymbol = *(ev->instream++);
			inOp = newOperator(inSymbol); // put left paren on Ators stack
			pushStack(ev->Ators, inOp);
			break;
			
		case rpar:
			n = sscanf(ev->instream, " %c%n", &inSymbol, &numread);
			ev->instream += numread;
			if (sizeStack(ev->Ands) != ev->numbin+1)
				return expErrorEval(ev);
			forceEval(ev, 0);
			if (isemptyStack(ev->Ators))	expErrorEval(ev); // too many right parens
			Operator op = topStack(ev->Ators);         // remove left paren operator from Ators stack
			freeOperator(op);
			popStack(ev->Ators);
			break;

		case end:
			if (sizeStack(ev->Ands) != ev->numbin+1)
				return expErrorEval(ev);
			forceEval(ev, 0);
			if (!isemptyStack(ev->Ators)) return expErrorEval(ev);
			And = topStack(ev->Ands);
			popStack(ev->Ands);
			double retval = value(And);
			freeOperand(And);
			return retval;
			break;

		case bad:
		default:
			return expErrorEval(ev);
		}
	}
}