Ir ao conteúdo
  • Cadastre-se

C Sempre que coloco o programa pra rodar dá um erro na estrutura stack


Shieda

Posts recomendados

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stack>


using namespace std;
int main(void)
{
	string fita;
	
	while (cin >> fita)
	{
		string resp;
		
		int cont = 0;
        stack <char> pilha;
        
        for ( int i=0; i < fita.size(); i++)
        {
            if (fita[i] == 'S')
				resp += 'B';
			else if (fita[i] == 'B')
			    resp += 'S';
			else if (fita[i] == 'C')
				resp += 'F';
			else if (fita[i] == 'F')
				resp += 'C';
        }
	
		for (int i=0; i < fita.size(); i++)
		{
			if (pilha.empty() || pilha.top() != resp[i])
				{pilha.push(fita[i]);}

			else 
			{
				while (true)
			    {
			    
					if (pilha.empty())
			        {i--;
					    break;}



	                	else if (resp[i] == pilha.top() )
						{
							cont++;
							pilha.pop();
							i++;
				

						}
					
					
					
					else
					{
						
						i--;
					    break;
					}
					
					
					if (i >= resp.size())
					{
					    i--;
					    break;
					}

				}
			}
		}
		
		printf("%d\n", cont);
	}
		system ("pause");
	return 0;
}

 

 

 

Sempre que coloco o programa pra rodar dá um erro na estrutura stack e não sei como resolver.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@kgin

43 minutos atrás, kgin disse:

Poste o enunciado para ficar mais fácil de entender o que você está tentando fazer.

Atividade 1242 do URI

 

Foi descoberta uma espécie alienígena de ácido ribonucleico (popularmente conhecido como RNA). Os cientistas, por falta de criatividade, batizaram a descoberta de ácido ribonucleico alienígena (RNAA). Similar ao RNA que conhecemos, o RNAA é uma fita composta de várias bases. As bases são B C F S e podem ligar-se em pares. Os únicos pares possíveis são entre as bases B e S e as bases C e F.
Enquanto está ativo, o RNAA dobra vários intervalos da fita sobre si mesma, realizando ligações entre suas bases. Os cientistas perceberam que:

- Quando um intervalo da fita de RNAA se dobra, todas as bases neste intervalo se ligam com suas bases correspondentes;
- Cada base pode se ligar a apenas uma outra base;
- As dobras ocorrem de forma a maximizar o número de ligações feitas sobre fitas;

As figuras abaixo ilustram dobras e ligacões feitas sobre fitas.

 

Sua tarefa será, dada a descrição de uma tira de RNAA, determinar quantas ligações serão realizadas entre suas bases se a tira ficar ativa.

 

Entrada

A entrada é composta por diversos casos de teste e termina com EOF. Cada caso de teste possui uma linha descrevendo a sequência de bases da fita de RNAA. Uma fita de RNAA na entrada contém pelo menos 1 e no máximo 300 bases. Não existem espaços entre bases de uma fita da entrada. As bases são 'B', 'C', 'F' e 'S'.

 

Saída

Para cada instância imprima uma linha contendo o número total de ligações que ocorre quando a fita descrita é ativada.

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Shieda    você postou esse código no tópico de linguagem  C   ,    mas esse código é da linguagem C++ ,  pois nele tem essa biblioteca "stack" que não tem na linguagem C  , 

2115086454_bibliotecastack.thumb.jpg.ce8dafa9e98d7bc4a2d45324a6eca075.jpg

e por que você esteja usando ela    ?    ,   parece que não tem necessidade  ,  então você pode ignora-la , comentando essa linha assim :

/// #include <stack>

mas você também pode deixa-lo ali mesmo do jeito que está , e colocar a extensão ".cpp" no nome do código salvo , que significa que o código está na Linguagem  C++ e para isso também coloque o 

#include <iostream>

e o código vai compilar , mas mesmo assim não creio que tenha resultado esperado .

Link para o comentário
Compartilhar em outros sites

14 horas atrás, devair1010 disse:

você postou esse código no tópico de linguagem  C   ,    mas esse código é da linguagem C++ ,  pois nele tem essa biblioteca "stack" que não tem na linguagem C

 

stack é uma classe e é uma implementação de pilha

 

14 horas atrás, devair1010 disse:

e por que você esteja usando ela    ?    ,   parece que não tem necessidade  ,  então você pode ignora-la , comentando essa linha assim :

/// #include <stack>

mas você também pode deixa-lo ali mesmo do jeito que está , e colocar a extensão ".cpp" no nome do código salvo , que significa que o código está na Linguagem  C++ e para isso também coloque o 

 

Usar uma pilha é uma boa ideia. Cada vez que a fira é dobrada são criados possíveis pares com as bases que estavam lá atrás na fita, a noção de dobra pode ser bem representada por uma pilha. 

 

Um modelo para esse problema pode usar DUAS pilhas, uma com as bases e outra com os pares, que podem ou não formam ligações conforme sejam das bases corretas. Claro, o problema pede apenas um número na saída.

 

Sobre o código, @Shieda escreveu um programa C. C++ é muito mais expressiva que C e sugiro usar C++

 

  • não precisa desses headers de C, stdio stdlib e string. Não há razão para usar isso em C++
  • se vai usar há uma convenção: use cstdio cstring e cstdlib e não use o .h por exemplo use #include <cstdio>
  • size() retorna size_t que não tem sinal. 
            for (int i = 0; i < fita.size(); i++)


    então use 
     

            for (size_t i = 0; i < fita.size(); i++)


    nesses casos todos.

    Escreva em torno dos dados

Fita deveria ser uma classe e talvez ter um método ativar e uma variável que mostrasse o total de ligações já dentro da classe. é mais simples. Mesmo em C seria melhor uma estrutura com a fita o contador e as ligações.

 

 

 

 

 

EXEMPLO

 

Como cada base pode participar em apenas uma ligação CFC gera uma dobra só.

 

C F C B S F F S B C C B

 

Ativando essa fita vem

 

    C F
    B C
    S F F S
    B C C B

com 3 dobras e as ligações FC na 1a BS na segunda e SB FC FC na 3a. 
A última SB não conta porque o lado S já foi usado na dobra anterior

 

Usando uma pilha elimina a possibilidade de usar 2X uma base

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!