Výsledky 1 až 13 z 13

Téma: [Java/C++] Fronta pomocí zásobníku a opačně

  1. #1
    Senior Member Avatar uživatele Anduril
    Založen
    12.10.2002
    Bydliště
    OVA, OL
    Věk
    42
    Příspěvky
    3 474
    Vliv
    322

    Standardní [Java/C++] Fronta pomocí zásobníku a opačně

    Potřebuju poradit (dobrovolný úkol do školy), jak vytvořit frontu pomocí zasobníku (resp. zasobníků) a zasobník pomocí fronty (resp. front)... Neví někdo? - stačí teoretický návrh
    ntb: HP EliteBook 8460p i7-2640M | 8GB RAM | 120GB SSD + 500GB HDD | ATi HD6470 | 14" HD+ | W7 PRO
    home: HP Docking Station | HP L2045W | WD 500GB Scorpio Blue USB box
    work: HP Docking Station | HP L2445W
    audio: Epiphone G-400 SG + Sounder Telecaster | E-MU 0202 | Cambridge Audio Azur 340R | Wharfedale Diamond 9.2 | Magnat Betasub 20A | Sennheiser HD555

  2. #2

    Standardní

    Trosku tomu mozna nerozumim, ja myslel ze fronta a zasobnik maji trosku odlisne pouziti, tak proc by se melo konstruovat jedno z druheho

  3. #3

    Standardní

    Jinak v Jave je to uz hotove - viz trida Stack, ktera je potomkem Vectoru a s Vectorem neni zadny problem zachazet jako s frontou (lepsi nez Vector ale bude pouzit LinkedList, ten je na to lepe optimalizovany)

  4. #4
    Senior Member Avatar uživatele Anduril
    Založen
    12.10.2002
    Bydliště
    OVA, OL
    Věk
    42
    Příspěvky
    3 474
    Vliv
    322

    Standardní

    Jasně - ja vím jak udělat zásobník/frontu pomocí pole, seznamu (list).. Problém je ale ten, že mám za úkol udělat frontu/zásobník pomocí zásobníku/fronty - úkol do Základů Algoritmizace (takže nějaké hotové věci mě nezajímají)!
    ntb: HP EliteBook 8460p i7-2640M | 8GB RAM | 120GB SSD + 500GB HDD | ATi HD6470 | 14" HD+ | W7 PRO
    home: HP Docking Station | HP L2045W | WD 500GB Scorpio Blue USB box
    work: HP Docking Station | HP L2445W
    audio: Epiphone G-400 SG + Sounder Telecaster | E-MU 0202 | Cambridge Audio Azur 340R | Wharfedale Diamond 9.2 | Magnat Betasub 20A | Sennheiser HD555

  5. #5

    Standardní

    Jeste ze uz nechodim do skoly

  6. #6
    Senior Member
    Založen
    08.10.2002
    Bydliště
    Mělník
    Věk
    44
    Příspěvky
    1 275
    Vliv
    290

    Standardní

    mno zasobnik a fronta totez jest, rozdil je odkud beru prvky kdzy vkladam na vrchol

    nevim jak mas tu frontu nebo zasobnik nadefinovanou nebo kdo ji psal tak tezke radit
    CASE Chieftec DX-01B-D { GIGABYTE X48 DS5 { Intel q9300 + 8GB + ATI x1600 + 2x Seagate ES2 1TB } + LiteOn SHM-165P6S} } + 21" Samsung SyncMaster 215TW

  7. #7

    Standardní

    Anduril: Kdyz ale nechces pouzit ani pole ani list, tak teda nevim jak to chces vubec resit ? Snad ne vymyslet nejakou hruzu ze zretezenych objektu jako ma treba binarni strom ? Stejne nekonec vymyslis neco hodne podobneho, jako je List

  8. #8

    Standardní

    S jednym zasobnikom to urcite neurobis (pokial s nim budes pracovat len ako so zasobnikom, tzn. operacie push a pop). S dvomi by to uz islo - pridanie do fronty = push do 1. zasobnika. Vyber z fronty = pop vsetko z 1. zasobnika a push do druheho, posledny prvok -> vysledok. Potom zasa vsetko pop z 2. zasobnika a push do prveho. Tomu sa hovori efektivne programovanie
    1: Asus P2B 1.10 • Celeron 1100@1364/1.8V • 512MB SDRAM • Samsung SP1213N+WD AC28400 • Toshiba XM-6402B+SD-M1212 • PowerColor AR2L Radeon 9100 64MB • 3C900-Combo • Bt848A • ASB-3940UA • AWE-64 • DTK PTP-3007 • VisionMaster 405 • Umax UC630 • Star LC24-200 Colour 2: PCPartner TXB820DS • Cyrix MII PR300/1.8V • 256MB SDRAM • 2xSamsung HD400LD+IT8212F • Accesstek CW4001 • LS-120 • Mystique 4MB • Millennium II 4MB • 3C509 • CMI8329A+Dream MIDI • ADI ProVista E44 • SyncMaster 203B Notebook: DTK FortisPro TOP-5A • P166MMX/1.8V • 80MB EDO • Hitachi 5K80 40GB • 12,1" TFT Router: A-Trend ATC-1425B • i486DX 50@33/5V • 48MB FPM • WD AC14300 • UMC UM9003F • HP PC LAN 16/TP+ Car: Mazda 323P BA • Z5 1489ccm, 65kW@5500rpm, 134Nm@4000rpm

  9. #9
    Senior Member minceVIP Avatar uživatele sisi
    Založen
    24.02.2003
    Bydliště
    Auckland, NZ
    Příspěvky
    2 176
    Vliv
    294

    Standardní

    Citace Původně odeslal Rainbow
    S jednym zasobnikom to urcite neurobis (pokial s nim budes pracovat len ako so zasobnikom, tzn. operacie push a pop). S dvomi by to uz islo - pridanie do fronty = push do 1. zasobnika. Vyber z fronty = pop vsetko z 1. zasobnika a push do druheho, posledny prvok -> vysledok. Potom zasa vsetko pop z 2. zasobnika a push do prveho. Tomu sa hovori efektivne programovanie
    Presne tak ako hovori Rainbow... Analogicky sa da pomocou dvoch front simulovat jeden zasobnik. Ale je to neuveritelna *KRAVINA* - naozaj nechapem, co tym moze niekto z pedagogickeho hladiska sledovat...
    Intel Core 2 Duo E6600 @ 3.2GHz (8 * 400MHz) @ 1.3V with Zalman CNPS9500 AT @ 1800RPM, ASUS P5B Deluxe/WiFi, 2x1GB Corsair Twin2X PC2-6400 DDRAM @ 400MHz (4-4-4-12) @ 2.1V, Leadtek 8800GT 512MB, WD Caviar SE16 250GB, Asus DRW-1608P3S, Creative SB Audigy Value, Logitech X-230 speakers, Enermax Liberty 400W, 2x120mm Thermaltake case fan @ 1800RPM, Thermaltake Aguila black case, HP LP2065 LCD, Logitech MX400

  10. #10
    Senior Member Avatar uživatele Anduril
    Založen
    12.10.2002
    Bydliště
    OVA, OL
    Věk
    42
    Příspěvky
    3 474
    Vliv
    322

    Standardní

    Citace Původně odeslal sisi
    Citace Původně odeslal Rainbow
    S jednym zasobnikom to urcite neurobis (pokial s nim budes pracovat len ako so zasobnikom, tzn. operacie push a pop). S dvomi by to uz islo - pridanie do fronty = push do 1. zasobnika. Vyber z fronty = pop vsetko z 1. zasobnika a push do druheho, posledny prvok -> vysledok. Potom zasa vsetko pop z 2. zasobnika a push do prveho. Tomu sa hovori efektivne programovanie
    Presne tak ako hovori Rainbow... Analogicky sa da pomocou dvoch front simulovat jeden zasobnik. Ale je to neuveritelna *KRAVINA* - naozaj nechapem, co tym moze niekto z pedagogickeho hladiska sledovat...
    Je to kravina... tady to je (JAVA).
    Dělal jsem to včera v noci, takže tam jsou možná nějaké chyby/nesmysly

    Fronta pomocí dvou zásobníků:
    Kód:
    // CStack
    // klasický zásobník
    public class CStack
    {
      private int[]   m_array;
      private int	  m_sp;
    
      // Konstruktor
      public CStack( int size )
      {
        m_array = new int[size];
        m_sp = 0;
      }
    
      // Vložení hodnoty do zásobníku
      public boolean Push( int value )
      {
        if( m_sp>=m_array.length ) return( false );
    
        m_array[m_sp++] = value;
        return( true );
      }
    
      // Výběr hodnoty ze zásobníku
      public int Pop()
      {
        if( IsEmpty() ) return( -1 );
    
        return( m_array[--m_sp] );
      }
    
      // Test prázdnosti zásobníku
      public boolean IsEmpty()
      {
        return&#40; m_sp<=0 &#41;;
      &#125;  
    
      // Získání 1. hodnoty na řadě v zásobníku
      public int Test&#40;&#41;
      &#123;
        if&#40; IsEmpty&#40;&#41; &#41; return&#40; -1 &#41;;
    
        return&#40; m_array&#91;m_sp-1&#93; &#41;;
      &#125;
    
      // Vymazání zásobníku  
      public void Reset&#40;&#41;
      &#123;
        while&#40; !IsEmpty&#40;&#41; &#41;
          Pop&#40;&#41;; 
      &#125;
    &#125;
    
    // CStackQueue
    // fronta implementovaná pomocí dvou zásobníků
    public class CStackQueue
    &#123;
      CStack   m_stack1;	// zásobník 1 - vkládání dat
      CStack   m_stack2;    // zásobník 2 - výběr dat
      int	   m_cur;       // aktivní zásobník
    
      // Přelití zásobníků
      private void RecastStacks&#40;&#41;
      &#123;
        if&#40; m_cur==1 &#41; &#123;
          m_stack2.Reset&#40;&#41;;
          while&#40; !m_stack1.IsEmpty&#40;&#41; &#41; &#123;
            m_stack2.Push&#40; m_stack1.Pop&#40;&#41; &#41;;
          &#125;
          m_cur = 2;
        &#125;
        else &#123;
          m_stack1.Reset&#40;&#41;;
          while&#40; !m_stack2.IsEmpty&#40;&#41; &#41; &#123;
            m_stack1.Push&#40; m_stack2.Pop&#40;&#41; &#41;;
          &#125;
          m_cur = 1;
        &#125;
      &#125;
    
      // Konstruktor
      // size = velikost fronty &#40;resp. zásobníků&#41;
      public CStackQueue&#40; int size &#41;
      &#123;
        m_stack1 = new CStack&#40; size &#41;;
        m_stack2 = new CStack&#40; size &#41;;
        m_cur = 1;
      &#125;
    
      // Vložení hodnoty do fronty
      public void Insert&#40; int value &#41;
      &#123;
        if&#40; m_cur!=1 &#41; RecastStacks&#40;&#41;;
        
        m_stack1.Push&#40; value &#41;;
      &#125;
     
      // Výběr hodnoty z fronty
      public int Remove&#40;&#41;
      &#123;
        if&#40; m_cur!=2 &#41; RecastStacks&#40;&#41;;
        
        return&#40; m_stack2.Pop&#40;&#41; &#41;;    
      &#125;
    
      // Test prázdnosti fronty
      public boolean IsEmpty&#40;&#41;
      &#123;
        if&#40; m_cur==1 &#41; return&#40; m_stack1.IsEmpty&#40;&#41; &#41;;
        else return&#40; m_stack2.IsEmpty&#40;&#41; &#41;;
      &#125;
    
      // Vymazání fronty
      public void Reset&#40;&#41;
      &#123;
        m_stack1.Reset&#40;&#41;;
        m_stack2.Reset&#40;&#41;;
        m_cur = 1;
      &#125;
    
      // Test 1. hodnoty ve frontě
      public int Test&#40;&#41;
      &#123;
        if&#40; m_cur!=2 &#41; RecastStacks&#40;&#41;;
        
        return&#40; m_stack2.Test&#40;&#41; &#41;;        
      &#125;
    &#125;
    
    // Test
    public class Test
    &#123;
      public static void main&#40; String&#91;&#93; args &#41;
      &#123;
        CStackQueue sq = new CStackQueue&#40; 10 &#41;;
        
        sq.Insert&#40; 1 &#41;;
        sq.Insert&#40; 2 &#41;;
        sq.Insert&#40; 3 &#41;;
        sq.Insert&#40; 4 &#41;;
        sq.Insert&#40; 5 &#41;;
        
        System.out.println&#40; "Test fronty &#40;1. prvek na rade&#41;&#58; " + sq.Test&#40;&#41; &#41;;
        sq.Remove&#40;&#41;;
        System.out.println&#40; "Test fronty &#40;1. prvek na rade&#41;&#58; " + sq.Test&#40;&#41; &#41;;
    
        sq.Insert&#40; 6 &#41;;
    
        while&#40; !sq.IsEmpty&#40;&#41; &#41;
          System.out.println&#40; "> " + sq.Remove&#40;&#41; &#41;;
    
      &#125;
    &#125;


    Zásobník pomocí dvou front:
    Kód:
    // CQueue
    // klasická fronta implementovaná pomocí dynam. struktur
    public class CQueue
    &#123;
      CQueueItem m_head;
      CQueueItem m_tail;
    
      // Konstruktor
      public CQueue&#40;&#41;
      &#123;
        m_head = m_tail = null;
      &#125;
    
      // Vložení hodnoty do fronty
      public void Insert&#40; int data &#41;
      &#123;
        CQueueItem n = new CQueueItem&#40; data &#41;;
        if&#40; IsEmpty&#40;&#41; &#41;
          m_head = n;
        else
          m_tail.next = n;
        m_tail = n;
      &#125;
    
      // Vybrání hodnoty z fronty
      public int Remove&#40;&#41;
      &#123;
        CQueueItem n;
        int        ret = -1;
        if&#40; !IsEmpty&#40;&#41; &#41; &#123;
          n = m_head;
          m_head = m_head.next;
          ret = n.data;
          n = null;
        &#125;
        return&#40; ret &#41;;
      &#125;
    
      // Test prázdnosti fronty
      public boolean IsEmpty&#40;&#41;
      &#123;
        return&#40; m_head==null &#41;;
      &#125;
    
      // Zjištění hodnoty prvku fronty, který je nařadě
      public int Test&#40;&#41;
      &#123;
        if&#40; !IsEmpty&#40;&#41; &#41;
          return&#40; m_head.data &#41;;
        else
          return&#40; -1 &#41;;
      &#125;  
     
      // Vymazání fronty
      public void Reset&#40;&#41;
      &#123;
        while&#40; m_head!=null &#41;
        &#123;
          m_tail = m_head;
          m_head = m_head.next;
          m_tail = null;
        &#125;
      &#125;
    &#125;
    
    // CQueueItem
    // jeden prvek fronty CQueue
    public class CQueueItem
    &#123;
      int        data;
      CQueueItem next;
    
      public CQueueItem&#40; int value &#41;
      &#123;
        data = value;
        next = null;
      &#125;
    &#125;
    
    // CQueueStack
    // Zásobník implementovaný pomocí 2 front
    public class CQueueStack
    &#123;
      CQueue m_queue1;
      CQueue m_queue2;
      int    m_cur;
    
      // Konstruktor
      public CQueueStack&#40;&#41;
      &#123;
        m_queue1 = new CQueue&#40;&#41;;
        m_queue2 = new CQueue&#40;&#41;;
        m_cur = 1;
      &#125;
    
      // Vložení hodnoty do zásobníku
      public void Push&#40; int value &#41;
      &#123;
        if&#40; m_cur==1 &#41; &#123;
          m_queue1.Insert&#40; value &#41;;
        &#125;
        else &#123;
          m_queue2.Insert&#40; value &#41;;
        &#125;
      &#125;
    
      // Vybrání zásobníku
      public int Pop&#40;&#41;
      &#123;
        int last = -1;
        
        if&#40; IsEmpty&#40;&#41; &#41; return&#40; -1 &#41;;
    
        if&#40; m_cur==1 &#41; &#123;
          m_queue2.Reset&#40;&#41;;
          while&#40; !m_queue1.IsEmpty&#40;&#41; &#41;
          &#123;
            last = m_queue1.Remove&#40;&#41;;
            if&#40; m_queue1.IsEmpty&#40;&#41; &#41; break;
            else m_queue2.Insert&#40; last &#41;;  
          &#125;
          m_cur = 2;
        &#125;
        else &#123;
          m_queue1.Reset&#40;&#41;;
          while&#40; !m_queue2.IsEmpty&#40;&#41; &#41;
          &#123;
            last = m_queue2.Remove&#40;&#41;;
            if&#40; m_queue2.IsEmpty&#40;&#41; &#41; break;
            else m_queue1.Insert&#40; last &#41;;  
          &#125;
          m_cur = 1;
        &#125;
    
        return&#40; last &#41;;    
      &#125;
    
      // Test prázdnosti zásobníku
      public boolean IsEmpty&#40;&#41;
      &#123;
        if&#40; m_cur==1&#41; return&#40; m_queue1.IsEmpty&#40;&#41; &#41;;
        else return&#40; m_queue2.IsEmpty&#40;&#41; &#41;;
      &#125;
    
      // Vymazání zásobníku
      public void Reset&#40;&#41;
      &#123;
        m_queue1.Reset&#40;&#41;;
        m_queue2.Reset&#40;&#41;;
        m_cur = 1;
      &#125;
    
    &#125;
    
    // Test
    public class Test
    &#123;
      public static void main&#40; String&#91;&#93; args &#41;
      &#123;
        CQueueStack qs = new CQueueStack&#40;&#41;;
        
        qs.Push&#40; 1 &#41;;
        qs.Push&#40; 2 &#41;;
        qs.Push&#40; 3 &#41;;
        
        System.out.println&#40; "> " + qs.Pop&#40;&#41; &#41;;
        System.out.println&#40; "> " + qs.Pop&#40;&#41; &#41;;
    
        System.out.println&#40; "--" &#41;;
        qs.Push&#40; 4 &#41;;
    
        while&#40; !qs.IsEmpty&#40;&#41; &#41;
          System.out.println&#40; "> " + qs.Pop&#40;&#41; &#41;;
    
        qs.Push&#40; 1 &#41;;
        qs.Push&#40; 2 &#41;;
        qs.Push&#40; 3 &#41;;
     
        System.out.println&#40; "--" &#41;;
        while&#40; !qs.IsEmpty&#40;&#41; &#41;
          System.out.println&#40; "> " + qs.Pop&#40;&#41; &#41;;    
      &#125;
    &#125;
    ntb: HP EliteBook 8460p i7-2640M | 8GB RAM | 120GB SSD + 500GB HDD | ATi HD6470 | 14" HD+ | W7 PRO
    home: HP Docking Station | HP L2045W | WD 500GB Scorpio Blue USB box
    work: HP Docking Station | HP L2445W
    audio: Epiphone G-400 SG + Sounder Telecaster | E-MU 0202 | Cambridge Audio Azur 340R | Wharfedale Diamond 9.2 | Magnat Betasub 20A | Sennheiser HD555

  11. #11

    Standardní

    Jen mala poznamka - nazvy metod by mely vzdy zacinat malym pismenem (je to respektovana konvence - velkym nazvy trid)

  12. #12
    Senior Member Avatar uživatele Anduril
    Založen
    12.10.2002
    Bydliště
    OVA, OL
    Věk
    42
    Příspěvky
    3 474
    Vliv
    322

    Standardní

    Citace Původně odeslal viki_
    Jen mala poznamka - nazvy metod by mely vzdy zacinat malym pismenem (je to respektovana konvence - velkym nazvy trid)
    V Javě - to možná jo... Jinak je to myslím jedno.
    Já jsem to vždy psal velkým - ve škole nás to taky tak učí..
    ntb: HP EliteBook 8460p i7-2640M | 8GB RAM | 120GB SSD + 500GB HDD | ATi HD6470 | 14" HD+ | W7 PRO
    home: HP Docking Station | HP L2045W | WD 500GB Scorpio Blue USB box
    work: HP Docking Station | HP L2445W
    audio: Epiphone G-400 SG + Sounder Telecaster | E-MU 0202 | Cambridge Audio Azur 340R | Wharfedale Diamond 9.2 | Magnat Betasub 20A | Sennheiser HD555

  13. #13

Informace o tématu

Users Browsing this Thread

Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)

Pravidla přispívání

  • Nemůžete zakládat nová témata
  • Nemůžete zasílat odpovědi
  • Nemůžete přikládat přílohy
  • Nemůžete upravovat své příspěvky
  •