タイトル説明
以下のスタックを使用してキューの実装:
- プッシュ(X) - スタック元素X
- ポップ() - トップ要素を削除します
- トップは() - トップ要素を取得します。
- 空() - スタックが空であるかどうかを返します
注意:
- サイズ、正面からポップ/ PEEK、バックにプッシュされ、これらの操作の空で法的です - あなただけのキューの基本的な操作を使用することができます。
- 使用している言語は、キューをサポートしていないかもしれません。あなたは長い間、標準の操作などとしてキュー、キューをシミュレートするために、リストまたは両端キュー(両端キュー)を使用することができます。
- あなたはすべての操作は、(例えば、空のスタックにポップ操作やトップを呼び出すことはありません)有効であることを仮定してもよいです。
問題解決のためのアイデア
私たちは、私たちがすることができ、FIFOキューの特性は要素であり、スタックの特性は、この問題の最初のうちの元素の最後であることを知っているスタックを実装するために2つのキューを使用する機能のを:
以下に示すように、まずスタックメモリ空間を実現するために使用される2つのキューを定義する;場合スタックので、連続番号一つにキューエレメントことと、場合スタック、要素キューの一つを順次キューに向けるようにとIIキュー、出力キューつの最後の要素、キューの最後の要素最後の「プッシュ」するので、このようにスタック操作を完了するが、この場合、要素はII 1つのキューが空のキューに格納されています数字が続く、再びポップ必要なときにキュー1つのキューに二つの要素、キュー要素は最終的にので、無限に、スタックを返します。
我々のアプローチは、このようにして得られた - キューが空でない場合、キューが空のランダムな要素である場合、キューへプッシュ要素がキューに、空でない、スタックの他のすべての要素が空のキューに順次である場合、最後に、スタックにのみリターン要素と決定スタックメソッドを空であるかどうかは、そうでなければ、スタックが空で、空でないスタックと非空のキューがあるか否かを判定する
コード
import java.util.LinkedList;
import java.lang.Integer;
public class MyStack {
/** Initialize your data structure here. */
private LinkedList<Integer>[] queue=new LinkedList[2]; //用两个队列实现栈
private int queueIndex;
public MyStack() {
for(int i=0;i<2;i++)
{
queue[i]=new LinkedList<>();
}
queueIndex=0;
}
/** Push element x onto stack. */
public void push(int x) {
queue[queueIndex].offer(x);
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
int element;
while(queue[queueIndex].size()>1)
{
int e=queue[queueIndex].pop();
queue[(queueIndex+1)%2].offer(e);
}
element=queue[queueIndex].pop();
queueIndex=(queueIndex+1)%2;
return element;
}
/** Get the top element. */
public int top() {
int element;
while(queue[queueIndex].size()>1)
{
int e=queue[queueIndex].pop();
queue[(queueIndex+1)%2].offer(e);
}
element=queue[queueIndex].pop();
queue[(queueIndex+1)%2].offer(element);
queueIndex=(queueIndex+1)%2;
return element;
}
/** Returns whether the stack is empty. */
public boolean empty() {
if(queue[0].isEmpty() && queue[1].isEmpty())
{
return true;
}
else
{
return false;
}
}
}