• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Stos (POLSKI SPOJ) (łatwy)

Cloud VPS
0 głosów
1,797 wizyt
pytanie zadane 20 maja 2019 w SPOJ przez kodowiec Początkujący (410 p.)
zmienione kategorie 21 sierpnia 2019 przez Patrycjerz

Witam,

Uczę sie programowania i mam problem z zaakceptowaniem zadania STOS przez sedziego na POLSKI SPOJ. Program dziala poprawnie i poprawnie wypisuje wyniki. Prosze o sugestie lub wskazowki co moglbym zmienic w kodzie.

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

int main()
{
    int tab[10]={};
    char zestaw;
    unsigned int stos=0;
    int dodaj=0;

    while(cin >> zestaw){
        if (zestaw == '+' && stos <10){
            cin >> dodaj;
            tab[stos]=dodaj;
            cin.clear();
            cin.sync();

            cout << ":)\n";
            stos++;
        }
        else if(zestaw == '-' && stos!=0){
            stos--;
            cout << tab[stos] << "\n";
        }
        else{
            cout << ":(\n";
            cin.clear();
            cin.sync();
        }

    }

    return 0;
}

 

link do zadania: https://pl.spoj.com/problems/STOS/

Z gory dziekuje za pomoc jesli takowa sie pojawi :)

2 odpowiedzi

+2 głosów
odpowiedź 20 maja 2019 przez j23 Mędrzec (195,240 p.)
edycja 20 maja 2019 przez j23
int value;
int stos = 0;
	
while(cin >> ws >> zestaw) {
	if (zestaw == '+') {
		cin >> value;
		if (stos < 10) { tab[stos++] = value; cout << ":)\n"; }
		else cout << ":(\n";
		continue;
	}

	if (zestaw == '-' && stos > 0) {
		cout << tab[--stos] << '\n';
	}
	else cout << ":(\n";
}

 

komentarz 21 sierpnia 2019 przez manjaro Nałogowiec (37,390 p.)

@fisker,

ja nie użyłem tutaj ani wskaźników, ani zaawansowanego input/output, ani nawet switcha.

Jedna tablica[10], jedna pętla i kilka dobrze postawionych ifów, to wszystko. Technika bardzo początkującego ;)

komentarz 21 sierpnia 2019 przez j23 Mędrzec (195,240 p.)

@fisker, Wydaje mi się, że szukasz optymalizacji na zbyt niskim poziomie. Sprawdzałeś mój kod?

ani zaawansowanego input/output

W sumie robisz to samo co w pozostałych kodach, tylko obudowałeś to w klasę/funkcje.

komentarz 21 sierpnia 2019 przez niezalogowany

fajnie działa. Ale przecież nie zrobię kopiuj wklej do spoja.

szukasz optymalizacji na zbyt niskim poziomie.

A fakt jakoś te moje programowanie stanęło w miejscu. Może jak będę więcej przepisywał, to bardziej się utrwali. Bo jak trzeba coś napisać od razu to mimo iż jestem to marnie. Ale zrozumienie się poprawiło kodów z internetu.

komentarz 21 sierpnia 2019 przez manjaro Nałogowiec (37,390 p.)

Ale zrozumienie się poprawiło kodów z internetu.

A to w jakim języku jest? ;)

komentarz 21 sierpnia 2019 przez niezalogowany
to tak jak z językiem co innego mówienie, co innego rozumienie , co innego czytanie, a co innego pisanie; I każda z tych czynności wymaga osobnego treningu. Ale robię coś nie tak bo postępy nie zadowalające. A może taki moje tempo.
0 głosów
odpowiedź 21 sierpnia 2019 przez mokrowski Mędrzec (158,840 p.)
edycja 21 sierpnia 2019 przez mokrowski

To tak naprawdę jest trochę nietypowy stos który w wyniku operacji zwraca wynik albo ":(" albo ":)" albo wartość przetworzoną na string.

Znaki '+' i '-', to komendy do wykonania gdzie komenda '+', wymaga następnego argumentu a '-' tego argumentu nie posiada.

Stąd warto stworzyć klasę stosu, która posiada metody pop() i push(int value) które wykonują te operacje.

#include <iostream>
#include <string>

struct Stack {
    constexpr static unsigned max_stack_size = 10;
    Stack()
      : values{}, size{} {}

    std::string push(int value) {
        return size < max_stack_size ? values[size++] = value, ":)": ":(";
    }

    std::string pop() {
        return size ? std::to_string(values[--size]): ":(";
    }
private:
    int values[max_stack_size];
    unsigned size;
};

static Stack stack;

int main() {
    Stack stack;
    char command;
    int value;
    while(std::cin >> command) {
        std::cout << (command == '+' ? std::cin >> value, stack.push(value): stack.pop()) << '\n';
    }
}

Jeśli jednak (co robisz), chcesz "rozebrać" klasę stosu na "elementy pierwsze", to bazując na Twoim kodzie i zakładając że stosujesz C++98 (a nie jak poprzednio w kodzie podanym C++11):

#include <iostream>

static const unsigned int maksymalna_wielkosc_stosu = 10;

using namespace std;

int main()
{
    int stos[maksymalna_wielkosc_stosu];
    char komenda;
    unsigned int wielkosc_stosu = 0;
    int wartosc;

    while(cin >> komenda){
        if (komenda == '+'){
            cin >> wartosc;
            if(wielkosc_stosu < maksymalna_wielkosc_stosu) {
                stos[wielkosc_stosu++] = wartosc;
                cout << ":)";
            } else {
                cout << ":(";
            }
        } else if((komenda == '-') && (wielkosc_stosu != 0)) {
            cout << stos[--wielkosc_stosu];
        } else {
            cout << ":(";
        }
        cout << '\n';
    }
}

Co wygląda mało czytelnie (IMHO).

BTW warto stosować nazwy które coś znaczą bo kod wtedy jest czytelny.

Reorganizując nieco kod, można tak:

#include <iostream>

static const unsigned int maksymalna_wielkosc_stosu = 10;

using namespace std;

int stos[maksymalna_wielkosc_stosu];
static unsigned int wielkosc_stosu;

void push_stack() {
    int wartosc;
    cin >> wartosc;
    if(wielkosc_stosu < maksymalna_wielkosc_stosu) {
        stos[wielkosc_stosu++] = wartosc;
        cout << ":)";
    } else {
        cout << ":(";
    }
}

void pop_stack() {
    if(wielkosc_stosu != 0) {
        cout << stos[--wielkosc_stosu];
    } else {
        cout << ":(";
    }
}

int main()
{
    char komenda;

    while(cin >> komenda){
        switch(komenda) {
        case '+':
            push_stack();
            break;
        case '-':
            pop_stack();
            break;
        }
        std::cout << '\n';
    }
}

A podchodząc bardziej funkcyjnie (ale bez ortodoksji), możesz mieć kod taki:

#include <iostream>
#include <iterator>
#include <string>
#include <algorithm>

using namespace std;

constexpr static unsigned int max_stack_size = 10;

int stack[max_stack_size];
static unsigned int stack_size;

std::string push_stack() {
    int value;
    cin >> value;
    return (stack_size < max_stack_size ? stack[stack_size++] = value, ":)": ":(");
}

std::string pop_stack() {
    return (stack_size ? std::to_string(stack[--stack_size]): ":(");
}

int main()
{
    transform(istream_iterator<char>(cin), istream_iterator<char>(), ostream_iterator<string>(cout, "\n"),
        [](char c) {
            return (c == '+' ? push_stack(): pop_stack());
    });
}

 

komentarz 21 sierpnia 2019 przez niezalogowany
Dzięki,a mi już trochę pomysłów zabrakło, a tu parę kodów z palca. Trasnform() ładnie to wygląda.

Podobne pytania

0 głosów
1 odpowiedź 283 wizyt
pytanie zadane 4 sierpnia 2020 w C i C++ przez Arek04 Użytkownik (740 p.)
0 głosów
1 odpowiedź 542 wizyt
pytanie zadane 24 maja 2020 w SPOJ przez szrek2002 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 370 wizyt
pytanie zadane 30 stycznia 2021 w C i C++ przez Rainbow99 Początkujący (430 p.)

93,457 zapytań

142,453 odpowiedzi

322,722 komentarzy

62,837 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...