b'\n_START_ARTICLE_\nStos (informatyka)\n_START_PARAGRAPH_\nStos (ang. Stack) \xe2\x80\x93 liniowa struktura danych, w kt\xc3\xb3rej dane dok\xc5\x82adane s\xc4\x85 na wierzch stosu i z wierzcho\xc5\x82ka stosu s\xc4\x85 pobierane (bufor typu LIFO, Last In, First Out; ostatni na wej\xc5\x9bciu, pierwszy na wyj\xc5\x9bciu). Ide\xc4\x99 stosu danych mo\xc5\xbcna zilustrowa\xc4\x87 jako stos po\xc5\x82o\xc5\xbconych jedna na drugiej ksi\xc4\x85\xc5\xbcek \xe2\x80\x93 nowy egzemplarz k\xc5\x82adzie si\xc4\x99 na wierzch stosu i z wierzchu stosu zdejmuje si\xc4\x99 kolejne egzemplarze. Elementy stosu poni\xc5\xbcej wierzcho\xc5\x82ka mo\xc5\xbcna wy\xc5\x82\xc4\x85cznie obejrze\xc4\x87, aby je \xc5\x9bci\xc4\x85gn\xc4\x85\xc4\x87, trzeba najpierw po kolei \xc5\x9bci\xc4\x85gn\xc4\x85\xc4\x87 to, co jest nad nimi._NEWLINE_Stos jest u\xc5\xbcywany w systemach komputerowych na wszystkich poziomach funkcjonowania system\xc3\xb3w informatycznych. Stosowany jest przez procesory do chwilowego zapami\xc4\x99tywania rejestr\xc3\xb3w procesora, do przechowywania zmiennych lokalnych, a tak\xc5\xbce w programowaniu wysokopoziomowym._NEWLINE_Przeciwie\xc5\x84stwem stosu jest kolejka, bufor typu FIFO (ang. First In, First Out; pierwszy na wej\xc5\x9bciu, pierwszy na wyj\xc5\x9bciu), w kt\xc3\xb3rym dane obs\xc5\x82ugiwane s\xc4\x85 w takiej kolejno\xc5\x9bci, w jakiej zosta\xc5\x82y dostarczone (jak w kolejce do kasy).\n_START_SECTION_\nHistoria\n_START_PARAGRAPH_\nStos zosta\xc5\x82 wymy\xc5\x9blony i opracowany przez niemieckiego naukowca informatyka Friedricha L. Bauera w 1955 roku, a opatentowany w 1957. Za ten wynalazek Friedrich L. Bauer dosta\xc5\x82 w 1988 roku od IEEE nagrod\xc4\x99 Computer Society Pioneer Award.\n_START_SECTION_\nImplementacja\n_START_PARAGRAPH_\nStrukturami danych s\xc5\x82u\xc5\xbc\xc4\x85cymi do reprezentacji stosu mog\xc4\x85 by\xc4\x87 tablice (gdy znamy maksymalny rozmiar stosu), tablice dynamiczne lub listy. Z\xc5\x82o\xc5\xbcono\xc5\x9b\xc4\x87 obliczeniowa operacji na stosie zale\xc5\xbcy od konkretnej implementacji, ale w wi\xc4\x99kszo\xc5\x9bci przypadk\xc3\xb3w jest to czas sta\xc5\x82y O(1).\n_START_SECTION_\nTablica statyczna\n_START_PARAGRAPH_\nclass Stos<E> {_NEWLINE_     Object[] tablica;   //tablica elementow stosu_NEWLINE_     licznik = 0;_NEWLINE_     _NEWLINE_     public Stos(int rozmiar) {_NEWLINE_         this.tablica  = new Object[rozmiar]; // tworzenie tablicy na elementy _NEWLINE_     }_NEWLINE__NEWLINE_     public void poloz(E wartosc) {_NEWLINE_         this.tablica[licznik] = wartosc;_NEWLINE_         this.licznik = this.licznik + 1;_NEWLINE_     };_NEWLINE__NEWLINE_     public E sciagnij() {_NEWLINE_         this.licznik = this.licznik - 1;_NEWLINE_         return (E) this.tablica[this.licznik];_NEWLINE_    };_NEWLINE_ };\n_START_SECTION_\nLista\n_START_PARAGRAPH_\nClass Element_stosu_NEWLINE_    poprzednik       // Wska\xc5\xbanik na poprzedni element stosu _NEWLINE_    wartosc          // Warto\xc5\x9b\xc4\x87 przechowywana w danym elemencie stosu_NEWLINE__NEWLINE_Class Stos_NEWLINE_    Top = NULL       // Wierzcho\xc5\x82ek stosu _NEWLINE_    _NEWLINE_    Push(Wartosc)    // dodanie elementu _NEWLINE_       nowy = new element stosu _NEWLINE_       nowy.wartosc = Wartosc_NEWLINE_       nowy.poprzednik = Top_NEWLINE_       Top = nowy _NEWLINE_    Pop()            // \xc5\x9bci\xc4\x85gni\xc4\x99cie elementu_NEWLINE_       wartosc = Top.wartosc _NEWLINE_       pomocnik = Top_NEWLINE_       Top = Top.poprzednik_NEWLINE_       usun(pomocnik) // usuni\xc4\x99cie \xc5\x9bci\xc4\x85gni\xc4\x99tego wierzcho\xc5\x82ka_NEWLINE_       return wartosc\n_START_SECTION_\nStos procesora\n_START_PARAGRAPH_\nJedn\xc4\x85 z implementacji stosu jako struktury danych jest obszar w pami\xc4\x99ci wydzielony dla danego w\xc4\x85tku, s\xc5\x82u\xc5\xbc\xc4\x85cy do przechowywania adres\xc3\xb3w powrotu i zmiennych lokalnych. Wielko\xc5\x9b\xc4\x87 stosu jest sta\xc5\x82a w czasie wykonywania programu, ustalana w czasie kompilacji, st\xc4\x85d zdarza si\xc4\x99, \xc5\xbce program chce zapisa\xc4\x87 w nim wi\xc4\x99cej ni\xc5\xbc przewidziano. M\xc3\xb3wimy w\xc3\xb3wczas o przepe\xc5\x82nieniu stosu.\n_START_SECTION_\npush\n_START_PARAGRAPH_\nPowoduje umieszczenie warto\xc5\x9bci na szczycie stosu. Odpowiada on przesuni\xc4\x99ciu rejestru ESP o odpowiedni\xc4\x85 ilo\xc5\x9b\xc4\x87 bajt\xc3\xb3w (w zale\xc5\xbcno\xc5\x9bci od rozmiaru rejestru, kt\xc3\xb3rego warto\xc5\x9b\xc4\x87 przenosimy na stos) w ty\xc5\x82 i zapisanie w tym miejscu \xc5\xbc\xc4\x85danej warto\xc5\x9bci.\n_START_SECTION_\npop\n_START_PARAGRAPH_\nPowoduje zdj\xc4\x99cie warto\xc5\x9bci ze stosu. Odpowiada on zapisaniu odpowiedniej ilo\xc5\x9bci bajt\xc3\xb3w (zale\xc5\xbc\xc4\x85cej od rozmiaru rejestru, do kt\xc3\xb3rego przenosimy warto\xc5\x9b\xc4\x87) w rejestrze i przesuni\xc4\x99ciu ESP o tyle\xc5\xbc bajt\xc3\xb3w do przodu.\n_START_SECTION_\nInstrukcje u\xc5\xbcywaj\xc4\x85ce stosu\n_START_PARAGRAPH_\nInstrukcje wywo\xc5\x82ania procedury call, przerwa\xc5\x84 programowych Int oraz sprz\xc4\x99towych odk\xc5\x82adaj\xc4\x85 na stosie adres do kt\xc3\xb3rego procesor ma powr\xc3\xb3ci\xc4\x87 po wykonaniu procedury. Dane te zdejmuje ze stosu instrukcj\xc4\x85 powrotu z procedury ret.'