Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Siemka jestem tu nowy, i na starcie chciałbym się przywitać.
Mam taki problem potrzeba mi algorytm z tablicową implementacja kolejki, tylko że nie wiem jak się za to zabrać.
Przydało by się na blokach ale pseudo kod też powinien wystarczyć.
Więc czekam na jakieś wskazówki.
ZdejmijElement
ZdjetyElement = Kolejka[1]
i = 1
Dopóki i < LiczbaElementow
Kolejka[i] = Kolejka[i+1]
i = i + 1
LiczbaElementow = LiczbaElementow - 1
Pseudokod dla zdejmowania elementów. Elementy w kolejce numerowane są od 1. Trzeba jeszcze dodać sprawdzanie czy kolejce znajduje się co najmniej 1 element
Z tym usuwaniem jest ta że jak nawet usunę tego x=0 to i tak powtarza mi ta operacje 3 razy, i to jak wybieram operacje wyświetlania.
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
Perełka
Perełka
0
no i tak ma robić, skoro po wykonaniu case 4: nie masz break; :)
system("pause"); nie jest funkcją blokującą :)
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
flabra
flabra
Rejestracja:ponad 21 lat
Ostatnio:ponad 12 lat
0
Kopiuj
> pause
bash: pause: command not found
daltego między innymi przestałem moderować na forum. Ile mozna wciąź powtarzać te same błedy. 'pause' jest niczym więcej niż pozostałością dosa. A wystrzy PATH (pod dosem, uniksem/linuksem) podmienć, żeby 'pause' się zmieniło w na przykład w 'del'. NTFS ma symlinki od win 2000 albo i od samego początku, a pod niksami sym/hard-linki z suidem są wbudowane z założenia.
Nigdy. Nigdy nie używa się funkcji system(), jeżeli mozna to samo zaimplementować wewnątrz kodu, bo zbyt wiele elementów zależnych jest od użytkownika, który uruchamia daną aplikację i może ustawić ENV(ironment) (, a za system("pause") powinien byc z automatu ban na forum)
poza tym zwykla ordynarna implementacja FIFO na liście, nawet jednokierunkowej.
ja dopiero zaczynam z programowaniem a system("pause") jest jedyną funkcją jaką znam żeby na chwile zatrzymać program, a z getchar jeszcze nie wiem jak korzystać
flaber, masz traumatyczne życie jeśli przestałeś moderować na forum z powodu "pause" :P
flabra
a tam, system("pasue") to zuezuo, a mi sie nie chce kolejny raz czytac i wyjasniac rzeczy, ktore byly wyjasnione/
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
flabra
flabra
Rejestracja:ponad 21 lat
Ostatnio:ponad 12 lat
0
ok, sots i klejka w jednym. push() umieszcza na koncu, pop() pobiera z konca a get() z poczatku, ergo:
push+pop -> stos (FILO/LIFO)
push+get -> kolejka (FIFO/LILO)
Kopiuj
typedefint atomtype;structstos{
atomtype* tab;// atomtype musisz sobie zdefiniować, ty potrzebujesz intaint wykorzystane;// ilosc wykorzystanych pol w tablicy dynamicznejint przydzielone;// ilosc rzeczywiscie przydzielonych pol tablicy dynamicznej};voidpush(stos& st,atomtype& atom){// push - wrzuc atom na stos// element samokontroli stosuif(st.wykorzystane==st.przydzielone){// brak wiecej przydzielonego miejscaif(!st.przydzielone){// jesli nic nie przydzielone
st.przydzielone=1;// to przydziel 1 komorke}else st.przydzielone*=2;// w przeciwnym przypadku st.przydzielone=st.przydzielone*2// w ten sposob przydzielomy kolejno 1,2,4,8,16,32,... czyli potegi 2 ilosc komorek
st.tab=(atomtype*)realloc(st.tab,st.przydzielone*sizeof(atomtype));//przydziel nowy (podwojny) rozmiar pamieci}//memcpy(&st.tab[st.wykorzystane],atom,sizeof(atomtype));
st.tab[st.wykorzystane]=atom;// w tym wypadku to co wyzej, ale po ludzku
st.wykorzystane++;}intpop(stos& st,atomtype& atom){if(!st.wykorzystane)return0;// stos jest pusty zwroc FALSE
st.wykorzystane--;// st.wykorzystane=st.wykorzystane-1;//memcpy(atom,&st.tab[st.wykorzystane],sizeof(atomtype));
atom=st.tab[st.wykorzystane];// w tym wypadku to co wyzej, ale po ludzku// element samokontroli stosuif(st.wykorzystane<=st.przydzielone/2){// jezeli jest wykorzystane pol lub mniej komorek przydzielonych dla stosu
st.przydzielone/=2;// st.przydzielone=st.przydzielone/2
st.tab=(atomtype*)realloc(st.tab,st.przydzielone*sizeof(atomtype));// przydziel polowe tego co bylo}return1;// gdy na stosie cos bylo, zwroc TRUE}intget(stos& st,atomtype& atom){if(!st.wykorzystane)return0;// stos jest pusty zwroc FALSE
st.wykorzystane--;// st.wykorzystane=st.wykorzystane-1;//memcpy(atom,st.tab,sizeof(atomtype)); // st.tab == &st.tab[0]
atom=*st.tab;// *st.tab == st.tab[0]int i=0;// roznica pomiedzy get i popwhile(i<st.wykorzystane){// sprawdz czy nie powinno byc <=, ale raczej nie powinno//memcpy(&st.tab[i],&st.tab[i+1],sizeof(atomtype));
st.tab[i]=st.tab[i+1];
i++;}// element samokontroli stosuif(st.wykorzystane<=st.przydzielone/2){// jezeli jest wykorzystane pol lub mniej komorek przydzielonych dla stosu
st.przydzielone/=2;// st.przydzielone=st.przydzielone/2
st.tab=(atomtype*)realloc(st.tab,st.przydzielone*sizeof(atomtype));// przydziel polowe tego co bylo}return1;// gdy na stosie cos bylo, zwroc TRUE}voidstworzstos(stos& st,int iloscpoczatkowa){// Stworz stos i przydizel na poczatek czesc komorek
st.przydzielone=iloscpoczatkowa;
st.wykorzystane=0;// swiezy stosik, nie ma praw miec czegokolwiek wykorzystanego
st.tab=(atomtype*)malloc(iloscpoczatkowa*sizeof(atomtype));// przydziel tablicy pamiec: iloscpoczatkowa*rozmiar komorki}voidzwolnijstos(stos& st){// wyczyść stos ze wszystkiegoif(st.tab)free(st.tab);// czyszczenie resztek
st.tab=0;// st.tab=NULL;
st.przydzielone=0;// no i oczywiście wyzeruj
st.wykorzystane=0;}
W tym kodzie nie ma kontroli, czy malloc/realloc nie zwrocił 0/NULL, potrzebna tylko w funkcjach stworzstos i push, gdzie moze nastapic dodanie ilosci pamieci, pop i get conajwyżej zwalniają część pamięci, więc tu o problemie nie ma mowy.
Uzycie:
stworzstos() -> push()/get()/pop() x N -> zwolnijstos()
Po zwolnijstos() można uzywać push()/pop()/get() od nowa, bez tworzenia, ale można też stworzyć stos od nowa przydzielając początkową ilośc komórek.
dla szybkości mozna wprowadzić mapowanie albo/i zwiekszenie indeksu poczatkowego zamiast przpisywania tablicy przy get, tak aby kolejne pushe mogly wstawiac wartości za pobrane getem, ale trzeba zmienic wtedy algorytm samokontroli i wprowadzic klilka prostych obliczen (+,%, pewnie cos jeszcze) do geta i popa.
edytowany 1x, ostatnio: flabra
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.