2017-04-11 10 views
0

スタックの一番上の要素を一番下にスワップする方法は不思議です。 スタックはこのように見える終わる必要があります。スタックの一番上の要素を一番下にスワップする方法

4 (top) 
3 
2 
1 

3 (top) 
2 
1 
4 

になり、私は、スタックの順番を逆にする再帰関数を考え出しました。しかし、私はそれを1つのためにしようとしている。私はそれが基本ケースを変更することと関係があると仮定しています。

public void roll() { 

    if (!isEmpty()){ 
     E temp = getBottom(this); 
     roll(); 
     this.push(temp); 
    } 

} 

private E getBottom(LinkedStack<E> p){ 
    E temp = p.pop(); 
    if (p.isEmpty()){ 
     return temp; 
    } else { 
     E temp2 = getBottom(p); 
     p.push(temp); 
     return temp2; 
    } 
} 

答えて

1

私は実際に反復的にそれをやって好むだろうが、あなたは再帰的に指定したことから、あなたはスタックを逆にして、部分的に再びそれを逆にすることによってそれを行うことができます。さらに簡単なだけで直接上から下に要素を送信することです:

public void sendTopToBottom() { 

    if (!isEmpty()){ 
     sendToBottom(pop()); 
    } 

} 

private void sendToBottom(E victim){ 
    if (isEmpty()){ 
     push(victim); 
    } else { 
     E temp = pop(); 
     sendToBottom(victim); 
     push(temp); 
    } 
} 
0

あなたが唯一の上の2つの要素を交換して、外側の第2トップの要素を残しておく必要があり、後に戻って、そのエレメントを押して、すべての要素をスワップ。例:

public void roll(Stack<Integer> stack) { 
     if (stack.size() <= 1) { 
      return; 
     } 
     Integer top1 = stack.pop(); 
     Integer top2 = stack.pop(); 
     stack.push(top1); 
     roll(stack); 
     stack.push(top2); 
    }