465 Stimmen

Wie implementiert man eine Warteschlange mit zwei Stapeln?

Angenommen, wir haben zwei Stapel und keine andere temporäre Variable.

Ist es möglich, eine Warteschlangen-Datenstruktur nur mit den beiden Stapeln zu "konstruieren"?

0 Stimmen

Um zu lachen, implementieren Sie beide Stapel in ein einziges Array, wobei einer von jedem Ende aus zu dem anderen wächst. Vergleichen Sie die Reihenfolge der Top-of-Stapel mit einer direkten Array-Implementierung der Warteschlange.

0voto

imvp Punkte 123
// Two stacks s1 Original and s2 as Temp one
    private Stack<Integer> s1 = new Stack<Integer>();
    private Stack<Integer> s2 = new Stack<Integer>();

    /*
     * Here we insert the data into the stack and if data all ready exist on
     * stack than we copy the entire stack s1 to s2 recursively and push the new
     * element data onto s1 and than again recursively call the s2 to pop on s1.
     * 
     * Note here we can use either way ie We can keep pushing on s1 and than
     * while popping we can remove the first element from s2 by copying
     * recursively the data and removing the first index element.
     */
    public void insert( int data )
    {
        if( s1.size() == 0 )
        {
            s1.push( data );
        }
        else
        {
            while( !s1.isEmpty() )
            {
                s2.push( s1.pop() );
            }
            s1.push( data );
            while( !s2.isEmpty() )
            {
                s1.push( s2.pop() );
            }
        }
    }

    public void remove()
    {
        if( s1.isEmpty() )
        {
            System.out.println( "Empty" );
        }
        else
        {
            s1.pop();

        }
    }

0 Stimmen

Ohne eine Beschreibung der Anzahl der notwendigen Operationen ist diese Antwort nicht sinnvoll.

0voto

hIpPy Punkte 4040

Mit O(1) dequeue() was dasselbe ist wie bei pythonquick Antwort :

// time: O(n), space: O(n)
enqueue(x):
    if stack.isEmpty():
        stack.push(x)
        return
    temp = stack.pop()
    enqueue(x)
    stack.push(temp)

// time: O(1)
x dequeue():
    return stack.pop()

Mit O(1) enqueue() (dies wird in diesem Beitrag nicht erwähnt, daher diese Antwort), die auch Backtracking verwendet, um das unterste Element aufzublasen und zurückzugeben.

// O(1)
enqueue(x):
    stack.push(x)

// time: O(n), space: O(n)
x dequeue():
    temp = stack.pop()
    if stack.isEmpty():
        x = temp
    else:
        x = dequeue()
        stack.push(temp)
    return x

Das ist natürlich eine gute Programmierübung, da sie ineffizient, aber dennoch elegant ist.

0voto

Sarang Punkte 754

Meine Lösung mit PHP

<?php
$_fp = fopen("php://stdin", "r");
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
    $queue = array();
    $count = 0;
    while($line = fgets($_fp)) {
        if($count == 0) {
            $noOfElement = $line;
            $count++;
            continue;
        }
        $action = explode(" ",$line);
        $case = $action[0];
        switch($case) {
            case 1:
                $enqueueValue = $action[1];
                array_push($queue, $enqueueValue);
                break;
            case 2:
                array_shift($queue);
                break;
            case 3:
                $show = reset($queue);
                print_r($show);
                break;
            default:
                break;
        }
    }
?>

0 Stimmen

Ich sehe einen Nicht-Kommentar. Ich sehe keinen einzigen Stapel. Welche Frage soll dieser Beitrag beantworten?

-1voto

Irshad ck Punkte 90

Hier ist meine Lösung in Java mit linkedlist.

class queue<T>{
    static class Node<T>{
        private T data;
        private Node<T> next;
        Node(T data){
            this.data = data;
            next = null;
        }
    }
    Node firstTop;
    Node secondTop;

    void push(T data){
        Node temp = new Node(data);
        temp.next = firstTop;
        firstTop = temp;
    }

    void pop(){
        if(firstTop == null){
            return;
        }
        Node temp = firstTop;
        while(temp != null){
            Node temp1 = new Node(temp.data);
            temp1.next = secondTop;
            secondTop = temp1;
            temp = temp.next;
        }
        secondTop = secondTop.next;
        firstTop = null;
        while(secondTop != null){
            Node temp3 = new Node(secondTop.data);
            temp3.next = firstTop;
            firstTop = temp3;
            secondTop = secondTop.next;
        }
    }

}

Anmerkung: In diesem Fall ist die Pop-Operation sehr zeitaufwendig. Daher würde ich nicht empfehlen, eine Warteschlange mit zwei Stapeln zu erstellen.

0 Stimmen

Wo sind die Warteschlangenoperationen , sagen, enqueue(T value)T dequeue() ? Ist es notwendig, eine Instanzierung Node s in pop() ? Ohne eine Beschreibung der Anzahl der notwendigen Operationen ist diese Antwort nicht sinnvoll.

-1voto

PradGar Punkte 93
public class QueueUsingStacks<T>
{
    private LinkedListStack<T> stack1;
    private LinkedListStack<T> stack2;

    public QueueUsingStacks()
    {
        stack1=new LinkedListStack<T>();
        stack2 = new LinkedListStack<T>();

    }
    public void Copy(LinkedListStack<T> source,LinkedListStack<T> dest )
    {
        while(source.Head!=null)
        {
            dest.Push(source.Head.Data);
            source.Head = source.Head.Next;
        }
    }
    public void Enqueue(T entry)
    {

       stack1.Push(entry);
    }
    public T Dequeue()
    {
        T obj;
        if (stack2 != null)
        {
            Copy(stack1, stack2);
             obj = stack2.Pop();
            Copy(stack2, stack1);
        }
        else
        {
            throw new Exception("Stack is empty");
        }
        return obj;
    }

    public void Display()
    {
        stack1.Display();
    }

}

Bei jedem Enqueue-Vorgang wird der Stack1 nach oben erweitert. Bei jeder Dequeue-Operation leeren wir den Inhalt von Stack1 in Stack2 und entfernen das Element an der Spitze des Stacks Die Zeitkomplexität ist O(n) für Dequeue, da wir Stack1 in Stack2 kopieren müssen.

0 Stimmen

Dieser Code ist ineffizient (unnötiges Kopieren) und fehlerhaft: if (stack2 != null) ist immer wahr, weil stack2 wird im Konstruktor instanziiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X