data strukturer med javascript: stak og kø,,,,, 378,,,,,,,, 27,,,,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss. denne post er en del af en serie kaldet data strukturer i javascript. data strukturer med javascript: hvad ' en datastruktur.data strukturer med javascript: enkeltvis knyttet liste og dobbelt knyttet liste,,, hvad du vil skabe, to af de mest almindeligt anvendte data strukturer i web - udvikling er bundter og køer.mange brugere af internettet, herunder web - udviklere, er uvidende om det forbløffende faktum.hvis du er en af disse udviklere, så forbered dig på to oplysende eksempler: "ødelægge" operation af en tekst, redaktør bruger en stak til at organisere data; tilfælde loop af webbrowser, der håndterer hændelser (klik, hoovers osv.), benytter en kø for at behandle data.,,, nu stopper for et øjeblik forestille sig, hvor mange gange vi, som både brugere og udvikler, bruge stabler og køer.det er utroligt, ikke?på grund af deres allestedsnærværende og lighed i design, har jeg besluttet at bruge dem til at præsentere dig for data - strukturer. , en skorsten, i datalogi, en stak en lineær datastruktur.hvis denne erklæring er marginale værdi for dem, som den oprindeligt var med mig, at denne alternative: en stak organiserer data i rækkefølge. , denne rækkefølge er ofte beskrives som en bunke tallerkener på et cafeteria.når en tallerken er tilsat en bunke tallerkener, plade, bevarer den rækkefølge, da det blev tilføjet; når en tallerken tilføjes, det er skubbet til bunden af stakken.hver gang vi tilføje en ny tallerken, plade er skubbet til bunden af stakken, men det er toppen af stak plader. , denne proces med tilsætning af plader, bevarer den rækkefølge, når alle plader blev tilføjet i skorstenen.fjernelse af plader fra skorsten vil også bevare den rækkefølge, hvori alle plader.hvis en plade fjernes fra toppen af en skorsten, hver anden plade i skorstenen vil fortsat have den korrekte rækkefølge i stakken.hvad, jeg beskriver, eventuelt med for mange ord, er, hvordan plader er tilføjet, og fjernet på de fleste cafeterier! , at give et mere teknisk eksempel på en skorsten, lad os huske "ødelægge" operation af en tekst, redaktør.hver gang indsættes i en tekst, redaktør, denne tekst er skubbet ind i en bunke.den første tilføjelse til teksten redaktør er bunden af stakken; de seneste ændringer repræsenterer på toppen af bunken.hvis brugeren ønsker at ophæve den seneste ændring, toppen af stack er fjernet.denne proces kan gentages, indtil der ikke er flere tilføjelser til den bunke, som er en tom mappe! , drift af en skorsten, da vi har en begrebsmæssig model af en skorsten, lad os definere de to operationer i en stabel:,,, tryk (data), tilføjer data.,, pop(), fjerner de for nylig tilføjet data.,, gennemførelse af en skorsten, nu vi skrive koden til en skorsten. , egenskaber for en skorsten, for vores gennemførelse, vil vi skabe en konstruktøren hedder , skorsten.hver enkelt instans af den , skorsten, har to egenskaber, _size, og _storage,.,, funktion stack() {. _size = 0. _storage = {}},,, det her. _storage, gør det muligt for hver enkelt instans af skorsten, har sin egen beholder til lagring af data, denne. _size, afspejler antallet af gange data blev skubbet til den nuværende version af en skorsten.hvis en ny instans, der er oprettet, og data er skubbet til oplagring, så dette. _size, vil stige til 1.hvis oplysningerne er skubbet, igen i skorstenen, det her. _size, vil stige til 2.If data is removed from the stack, then ,this._size, will decrease to 1. ,,Methods of a Stack,,We need to define methods that can add (push) and remove (pop) data from a stack. Let's start with pushing data. ,,,Method 1 of 2:, ,,push(data),,,,(This method can be shared among all instances of ,Stack,, so we'll add it to the prototype of ,Stack,.) ,,We have two requirements for this method: ,,Every time we add data, we want to increment the size of our stack.,Every time we add data, we want to retain the order in which it was added.,,Stack.prototype.push = function(data) { //increases the size of our storage var size = this._size++; //assigns size as a key of storage //assigns data as the value of this key denne. _storage [størrelse] = data;}, vores gennemførelse af , tryk (data), omfatter følgende logik.erklærer en variabel, der hedder, størrelse, og tildeler den værdi, det her. _size + +. tildele , størrelse, som en nøgle her. _storage,.og tildele , data, som værdien af en tilsvarende nøgle. ,,, hvis vores stak påberåbes, at skubbe (data), fem gange, så størrelsen af vores mand vil være 5.den første skub til skorstenen vil tildele det data, en nøgle på 1 her. _storage,.den femte påberåbelse af presse (data), vil tildele den pågældende data en nøgle på 5 i dette. _storage,.vi har lige sat for at vores data.,,, metode 2 af 2:, pop(),,,,,, kan vi nu sætte data til en skorsten, det næste logiske skridt er at (at) data fra skorsten.- data fra en bunke er ikke blot fjernelse af data, og det er, at kun de for nylig tilføjet data. , her er vores mål for denne metode: , anvendes en stak nuværende størrelse for at få de seneste oplysninger, der er tilføjet. udgår mest for nylig tilføjet data., dekrement, _this. _size, efter en. returnere for nylig slettede data,.,, stack.prototype.pop = function() {var størrelse =. _size, deleteddata; deleteddata =. _storage [størrelse] udgår. _storage [størrelse] this.size--; tilbage deleteddata;};,,, pop() opfylder hvert af de fire mål.første erklærer vi to variabler:, størrelse, er igangsat til størrelsen af en skorsten. , deleteddata, er tilknyttet data for nylig tilføjet en skorsten.vi sletter den centrale værdi par vores seneste oplysninger, der er tilføjet.for det tredje dekrement på størrelse med en bunke af 1.for det fjerde tilbage i de data, der er fjernet fra skorstenen. , hvis vi teste vores nuværende gennemførelse af pop(), finder vi, at det fungerer for efter brug.hvis vi skubber (data) data, en skorsten, størrelsen af de stak forhøjelser af en.hvis vi pop(), data fra vores skorsten, størrelsen af vores stak formindskelser af. , et problem, men når vi vende rækkefølgen af besværgelse.overveje følgende scenario: vi påberåber os, pop(), og så , tryk (data).størrelsen af vores stak ændringer - 1 og 0.men den korrekte størrelse, der er 1.,, til at håndtere denne anvendelse, vil vi tilføje en, hvis udtalelse, pop(),. ,, stack.prototype.pop = function() {var størrelse =. _size, deleteddata; hvis (størrelse) (deleteddata =. _storage [størrelse] udgår. _storage [størrelse]. _size -; tilbage deleteddata;}}, med tilføjelse af vores, hvis udtalelse, liget af vores kode udføres kun, når der er data i vores lager. , fuldstændig gennemførelse af en skorsten, vores gennemførelse af skorsten, er fuldført.uanset i hvilken rækkefølge vi påberåbe sig nogen af vores metoder, vores kode virker! her, er den endelige version af vores kode:,, funktion stack() {. _size = 0. _storage = {}} stack.prototype.push = funktion (data) (var - størrelse = + +. _size; dette. _storage [størrelse] = data), stack.prototype.pop = function() {var størrelse = det. _size, deleteddata; hvis (størrelse) (deleteddata =. _storage [størrelse] udgår. _storage [størrelse]. _size... og vende tilbage deleteddata;}}, fra stak til kø, nogle er nyttig, når vi ønsker at tilføje oplysninger i rækkefølge og fjerne data.på grundlag af sin definition, en skorsten, kan fjerne kun de seneste oplysninger, der er tilføjet.hvad sker der, hvis vi ønsker at fjerne de ældste data?vi vil bruge en data - struktur, der hedder kø.,,, en kø, svarende til en skorsten, køen er en lineær datastruktur.i modsætning til en stak, en kø sletter kun de ældste added data. ,,, at hjælpe dig, konceptualisere hvordan dette vil fungere, lad os tage et øjeblik til at bruge en analogi.forestil dig en kø er meget lig billetsystemet i en butik.hver kunde er en billet og serveres, når deres antal er.den kunde, der tager det første billet skal serveres først. , lad os yderligere at forestille sig, at denne billet er "en" vises på det.den næste billet er nummer to "vises på det.den kunde, der tager den anden billet vil blive tjent andet. (hvis vores billetsystem drives som en skorsten, den kunde, der trådte den stak først vil være den sidste til at ske fyldest!),,, en mere praktisk eksempel på en kø er tilfælde loop af webbrowser.som forskellige begivenheder bliver udløst, f.eks. at trykke på en knap, de er tilsat en begivenhed loop er kø og behandles i den rækkefølge, de er opført i køen. , drift af en kø, da vi har en begrebsmæssig model af en kø, så lad os definere sine operationer.som de vil bemærke, at driften af en kø, er meget lig en skorsten.forskellen ligger i, hvor data er fjernet. ,,,, enqueue (data), giver oplysninger til en kø. ,, dequeue, fjerner de ældste tilføjet oplysninger til en kø. , er gennemførelsen af en kø, så lad os skrive koden for en kø!,,, egenskaber for en kø, for vores gennemførelse, vil vi skabe en konstruktøren hedder, kø.så vil vi tilføje tre egenskaber, _oldestindex,, _newestindex, og _storage,.behovet for, at både , _oldestindex, og _newestindex, vil blive tydeligere i næste afsnit. , fungerer queue() {. _oldestindex = 1; dette. _newestindex = 1; dette. _storage = {}}, metoder til en kø,,,, vi nu vil skabe de tre metoder, fælles i alle tilfælde af en kø:, size(),, enqueue (data), og dequeue (data).jeg vil skitsere målsætningerne for hver metode, viser, at det er kode for hver metode, og forklare den kode for hver metode. ,,,, metode 1 af 3:, ,, size(),,,,,, vi har to mål for denne metode:,, returnerer den korrekte størrelse for en kø, bevarer den rette afstand. nøgler til en kø.,, queue.prototype.size = function() {tilbage. _newestindex -. _oldestindex;};,, gennemførelse, size(), kan forekomme banalt, men du hurtigt vil finde det for at være forkert.for at forstå, hvorfor skal vi hurtigt vende tilbage til hvor, størrelse, blev gennemført for en skorsten. , ved hjælp af vores begrebsmæssige en skorsten, lad os forestille os, at vi presser fem plader på en stak.størrelsen af vores stack er fem, og hver enkelt plade har et nummer, der er forbundet med det fra en (første ekstra tallerken) til 5 (sidste ekstra tallerken).hvis vi fjerner tre plader, så har vi to plader.vi kan blot trække tre af fem for at få den rigtige størrelse, som er to.her er det vigtigste punkt på størrelse med en bunke: den nuværende størrelse er den rigtige nøgle i forbindelse med nummerpladen på toppen af skorsten (2) og den anden plade i stakken (1).med andre ord, de forskellige nøgler er altid fra de nuværende størrelse 1.,, lad os nu anvende denne gennemførelse af stack er, størrelse, at vores kø.forestil dig, at fem kunder en billet fra vores billetteringssystem.den første kunde er en billet, der er forsynet med nummer og den femte kunde er en billet, der er forsynet med nummer 5.med en kø, kunden med første billet er serveret. ,,, lad os nu forestille sig, at den første kunde er forkyndt, og at denne billet er fjernet fra listen.på samme måde som en skorsten, vi kan få den rigtige størrelse af vores kø ved at fratrække 1 af 5.vores kø har i øjeblikket fire unserved billetter.er det her et problem: størrelse ikke længere er den korrekte billet nummer.hvis vi blot trækkes fra fem, ville vi have en størrelse på 4.vi kan ikke bruge 4 for at bestemme den aktuelle vifte af resterende billetter i køen.vi har billetter i kø med tal fra 1 til 4 eller fra 2 til 5?svaret er uklar. ,,, det er fordelen ved at have følgende egenskaber i en kø:, _oldestindex, og , _newestindex,.alt dette kan synes confusing-i er til tider forvirret.det hjælper mig med at rationalisere alt er følgende eksempel har jeg udviklet.,, forestille os, at vores deli har to billetsystemer: ,,,, _newestindex, repræsenterer en billet fra en kunde billetteringssystem.,, _oldestindex, repræsenterer en billet fra en ansat billetteringssystem.,, her er den sværeste koncept til at forstå, hvad angår at have to billetsystemer: når tallene i begge systemer er identiske, hver kunde i køen, er blevet behandlet, og køen er tom.vi vil anvende følgende scenario for at styrke denne logik:,,, en kunde har en billet.kundens billet nummer, som er hentet fra , _newestindex, er 1.den næste billet til rådighed i kunden billet system er 2. , en ansat ikke tager en billet, og den nuværende billet på de ansattes billet system er 1. , vi tager den nuværende billet nummer i kunden system (2) og fratrækker antallet i de ansattes system (1) at få nummeret 1.nummer 1 er antallet af billetter, stadig i kø, som ikke er blevet fjernet. , den ansatte har en billet fra deres billetteringssystem.denne billet er kunden billet serveret.den bøde, der blev serveret er hentet fra , _oldestindex,, som viser nummer 1. , gentag trin 4, og forskellen er nul, er der ikke flere billetter i køen!, har vi nu en fast ejendom, _newestindex,), som kan fortælle os det største antal (centrale), der tildeles i kø og en ejendom (, _oldestindex,), der kan fortælle os, den ældste indekstal (centrale) i køen. , vi har udforsket tilstrækkeligt, size(), så lad os nu, enqueue (data),.,,, metode 2 af 3:, ,, enqueue (data),,,,,,,, enqueue, vi har to mål:,,, _newestindex, som et centralt af denne. _storage, og anvendelse af data, der skal tilføjes som værdien af den nøgle. (værdien af, _newestindex af 1.,, der er baseret på disse to mål, vil vi skabe efter gennemførelsen af enqueue (data):,, queue.prototype.enqueue = funktion (data) (denne. _storage [dette. _newestindex] = data. _newestindex +;}, liget af denne metode indeholder to linier.den første linje, vi bruger det. _newestindex, at skabe en ny nøgle til det. _storage, og tildele, data, til det.her. _newestindex, altid starter kl. 1.på den anden linje kode, vi tillæg. _newestindex ved 1, der ajourfører sin værdi på 2. ,, det er den kode, vi har brug for, enqueue (data).lad os nu gennemføre, dequeue(),.,,, metode 3 af 3:, ,, dequeue(),, , her er målene for denne metode: , fjerne de ældste data i en kø. (_oldestindex,.,, queue.prototype.dequeue = function() {var oldestindex = det. _oldestindex, deleteddata =. _storage [oldestindex] udgår. _storage [oldestindex]. _oldestindex + + og vende tilbage deleteddata;}, i kroppen, dequeue(), erklærer vi to variabler.den første variabel, oldestindex,, tildeles en kø er løbende værdi for det. _oldestindex,.den anden variabel, deleteddata,, tildeles den værdi, der er indeholdt i denne. _storage [oldestindex]. , næste, sletter vi de ældste indeks i køen.efter det er slettet, vi tillæg. _oldestindex af 1.endelig er vi tilbage, de data, vi bare slettet den. , svarende til det problem i vores første gennemførelse af pop(), med en skorsten, vores gennemførelse af dequeue() ikke håndtere situationer, hvor data er fjernet, før de data, der er tilføjet.vi er nødt til at skabe en betinget af denne anvendelse. ,, queue.prototype.dequeue = function() {var oldestindex =. _oldestindex, newestindex =. _newestindex, deleteddata; hvis (oldestindex!= = newestindex) (deleteddata =. _storage [oldestindex] udgår. _storage [oldestindex]. _oldestindex + + og vende tilbage deleteddata;}}, når værdien af , oldestindex, og newestindex, ikke er ens, så vi henrette den logik, vi havde før. ,, fuldstændig gennemførelse af en kø, gennemførelse af en kø er fuldført.lad os se hele koden.,, funktion queue() {. _oldestindex = 1; dette. _newestindex = 1; dette. _storage = {}} queue.prototype.size = function() {tilbage. _newestindex -. _oldestindex;}; queue.prototype.enqueue = funktion (data) (denne. _storage [. _newestindex] = data og det her. _newestindex + +), queue.prototype.dequeue = function() {var oldestindex =. _oldestindex, newestindex =. _newestindex, deleteddata; hvis (oldestindex!= = newestindex) (deleteddata =. _storage [oldestindex] udgår. _storage [oldestindex]. _oldestindex + + og vende tilbage deleteddata;}};,, konklusion i denne artikel, vi har undersøgt to lineære data strukturer: bundter og køer.en bunke lagrer data i rækkefølge og fjerner de for nylig tilføjet oplysninger; en kø lagrer data i rækkefølge, men fjerner de ældste added data. , hvis gennemførelsen af disse data strukturer synes trivielt, minde dig om anvendelsen af data strukturer.de er ikke konstrueret til at være alt for komplicerede; de er beregnet til at hjælpe os organisere data.i denne forbindelse, hvis du finder dig selv med data, der skal tilrettelægges i rækkefølge, overveje at anvende en skorsten eller kø. ,