Sort, spoj

0

Witam ma ktoś pomysł jak skrócić działanie programu? Wiem, że warunek nie kończenia się tej pętli iście z piekła rodem, ale nie miałem innego pomysłu(While(cin>>a) nie pasował). Link: http://pl.spoj.com/problems/STOS/

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
    char a;
    vector <int> b;
    int c;
    for (int j=0; 0<1; j++)
    {
        cin>>a;
        if (a=='+')
        {
            if(b.size()==10)
                cout<<":("<<endl;
            else
            {
                cin >>c;
                b.push_back( c );
                cout<<":)"<<endl;
            }
        }
        else //-
        {
            if (b.empty()==true)
                cout<<":("<<endl;
            else
            {
                cout<<b[j-1]<<endl;
                b.pop_back();
                j--;
                j--;
            }
        }
    }
    return 0;
}
 
1

Zamiast jakichś wymysłów w stylu 0<1 wystarczy "pusta" pętla for:

 for(;;)

Tak twór wykonuje się bez końca (chyba że użyjesz słowa kluczowego break)

Co do ifów:

if(warunek == true)

to to samo co

if(warunek)

Nazwy zmiennych niezrozumiałe, pojedyncze litery nic nie mówią nikomu.

Czy nie lepiej zamiast zmiennej j (super nazwa) nie użyć po prostu size()?? Użyłeś go kilka linijek wcześniej! (linia bodajże 13)
Na przykład:

cout<< stos[stos.size()-1]; // wypisze ostatni element
 stos.pop_back(); // usunie ze stosu ostatni element

Więcej o size:
http://www.cplusplus.com/reference/vector/vector/size/

1
Garniturek napisał(a):

(While(cin>>a) nie pasował)

Oczywiście, że pasował.

#include <iostream>
#include <string>
#include <array>
using namespace std;

using Stack = array<int, 10>;

int pop(const Stack& stack, int current)
{
	if (current > 0)
		cout << stack[--current] << "\n";
	else
		cout << ":(\n";
	
	return current;
}

int push(Stack& stack, int current)
{
	int newValue;
	cin >> newValue;
	if (current < 10)
	{
		stack[current++] = newValue;
		cout << ":)\n";
	}
	else
	{
		cout << ":(\n";
	}
	
	return current;
}

int main() 
{
	Stack stack;
	int current = 0;
	string command;
	while (cin >> command)
	{
		if (command == "-")
		{
			current = pop(stack, current);
		}
		else if (command == "+")
		{
			current = push(stack, current);
		}
		else
		{
			cout << ":(\n";
		}
	}
	
	return 0;
}
0

Poprawiłem to co wskazał mi @Bleph, ale problem pozostaje ten sam "Przekroczono limit czasu". Czy sposób proponowany przeze mnie będzie zły czy wystarczy jakoś zoptymalizować ten program i będzie okej? :)

1

Ja bym zamiast for (int j=0; 0<1; j++) dał while (cin >> a), zaś zamiast else daj if (a == '-') Wtedy uzyskasz coś takiego i dostaniesz AC

 
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
    char a;
    vector <int> b;
    int c;
    //for (int j=0; 0<1; j++)
    while (cin >> a)
    {
        //cin>>a;
        if (a=='+')
        {
            if(b.size()==10)
                cout<<":("<<endl;
            else
            {
                cin >>c;
                b.push_back( c );
                cout<<":)"<<endl;
            }
        }
        if (a == '-')
        //else
        {
            if (b.empty()==true)
                cout<<":("<<endl;
            else
            {
                cout<<b.back()<<endl;
                b.pop_back();
            }
        }
    }
    return 0;
}

ps czemu vector a nie http://www.cplusplus.com/reference/stack/stack/?

0

Miałem to, tylko zostawiłem pustą pętle for(;;) zamiast while, o którym też już była mowa. Miałem rozwiązanie, tylko nie pomyślałem. Dzięki :)

0

Ale Wasze rozwiązanie jest przekominowane i tak. Przecież w pierwszej linii polecenia jest napisane:

Napisz program, który w 10-elementowej tablicy symuluje działanie stosu. Na początku stos jest pusty, a następnie ma się zapełniać lub opróżniać zgodnie z wczytanymi z wejścia poleceniami.

Ale dziwię się, że Wasze rozwiązanie przeszło. Robiąc te zadanie myślałem, że wszelkie stosy itp są zablokowane. Swoją drogą ja i tak robiłem to w czystym C :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1