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;