2つのスタック実装キュー、2つのキュー実装スタック---Java
2982 ワード
2つのスタック実装キュー
2つのスタック、1つのpushスタック、1つのpopスタックを採用して、毎回pushの時に直接pushスタックに入って、毎回popの時、popスタックの中から弾き出すだけで、popスタックがnullの時、pushスタックの中のすべての要素をpopスタックの中に押して、このように要素の追加の順序を還元して、先に出て、注意して、popスタックがnullの時だけスタックを押すことができて、乱序でなければ、先進的な先出の目的を達成することはできない.例:
pushスタックに1,2,3,4,5を追加します.
pop操作が必要になると、popスタックがnullであることを保証する場合、popスタックのすべての要素をpopスタックにポップアップし、ポップアップ順序が5,4,3,2,1であると、popスタックの要素の追加順序も5,4,3,2,1であり、その後、スタックトップ要素1を直接ポップアップし、先進的な先出に合致する.
2つのキュー実装スタック
2つのスタック、1つのqueue、1つのhelpを採用して、pushのたびに直接queueキューに入って、popの時、直接queueの中の要素poll()を1つの要素しか残っていないまで、残りの1つの要素poll()を落として、残りの要素はすべてhelpキューにaddして、注意して、毎回popあるいはpeekの後で2つのキューのインデックスを交換しなければなりません.例:
push了1,2,3,4,5到queue Pop操作:キューqueueが順次ポップアップされてhelpキューに追加され、1,2,3,4現在help要素は1,2,3,4であり、次にqueueに残っている唯一の要素5がポップアップされ、後進先出に合致する.
swap()はqueueとhelpインデックスを交換し、新しい要素が追加され続けるようにします.
2つのスタック、1つのpushスタック、1つのpopスタックを採用して、毎回pushの時に直接pushスタックに入って、毎回popの時、popスタックの中から弾き出すだけで、popスタックがnullの時、pushスタックの中のすべての要素をpopスタックの中に押して、このように要素の追加の順序を還元して、先に出て、注意して、popスタックがnullの時だけスタックを押すことができて、乱序でなければ、先進的な先出の目的を達成することはできない.例:
pushスタックに1,2,3,4,5を追加します.
pop操作が必要になると、popスタックがnullであることを保証する場合、popスタックのすべての要素をpopスタックにポップアップし、ポップアップ順序が5,4,3,2,1であると、popスタックの要素の追加順序も5,4,3,2,1であり、その後、スタックトップ要素1を直接ポップアップし、先進的な先出に合致する.
class TwoStackQueue {
private Stack pushStack;
private Stack popStack;
TwoStackQueue() {
pushStack = new Stack<>();
popStack = new Stack<>();
}
public void push(int num) {
pushStack.push(num);
}
public int pop() {
if (pushStack.isEmpty() && popStack.isEmpty()) {
throw new RuntimeException("Queue is empty!");
}
// popStack , pushStack popStack
if (popStack.isEmpty()) {
while ( !pushStack.isEmpty() ) {
popStack.push(pushStack.pop());
}
}
// popStack
return popStack.pop();
}
public int peek(){
if (pushStack.isEmpty() && popStack.isEmpty()) {
throw new RuntimeException("Queue is empty!");
}
if (popStack.isEmpty()) {
while ( !pushStack.isEmpty() ) {
popStack.push(pushStack.pop());
}
}
return popStack.peek();
}
}
2つのキュー実装スタック
2つのスタック、1つのqueue、1つのhelpを採用して、pushのたびに直接queueキューに入って、popの時、直接queueの中の要素poll()を1つの要素しか残っていないまで、残りの1つの要素poll()を落として、残りの要素はすべてhelpキューにaddして、注意して、毎回popあるいはpeekの後で2つのキューのインデックスを交換しなければなりません.例:
push了1,2,3,4,5到queue Pop操作:キューqueueが順次ポップアップされてhelpキューに追加され、1,2,3,4現在help要素は1,2,3,4であり、次にqueueに残っている唯一の要素5がポップアップされ、後進先出に合致する.
swap()はqueueとhelpインデックスを交換し、新しい要素が追加され続けるようにします.
class TwoQueueStack {
private Queue queue;
private Queue help;
TwoQueueStack(){
queue = new LinkedList<>();
help = new LinkedList<>();
}
public void push(int num) {
queue.add(num);
}
public int pop(){
if (queue.isEmpty()) {
throw new RuntimeException("Stack is empty!");
}
while ( queue.size() > 1 ) {
help.add(queue.poll());
}
int res = queue.poll();
swap();
return res;
}
public int peek(){
if (queue.isEmpty()) {
throw new RuntimeException("Stack is empty!");
}
while ( queue.size() > 1 ) {
help.add(queue.poll());
}
int res = queue.poll();
help.add(res);
swap();
return res;
}
private void swap() {
Queue tmp = help;
help = queue;
queue = tmp;
}
}