インタビュー中、スタックとキューはしばしば調べてペアで表示されます。この記事には、スタックとキューの次のテストコンテンツが含まれています。
(1)スタックの作成
(2)キューの作成
(3)2つのスタックがキューを実装します
(4)2つのキューがスタックを実装します
(5)最小関数min()でスタックを設計し、min、push、pop、およびすべての時間の複雑さがo(1)であることを必要とします
(6)スタックのプッシュシーケンスとポップシーケンスが一貫しているかどうかを判断します
1。スタックの作成:
次に、拡張を容易にするために、リンクされたリストの形式のスタックを作成します。
コード実装:
パブリッククラス{パブリックノード電流; Node node = new node.pre = current; } public node pop(current == null){null} current;ノードはスタックに置かれています。 }} static void main(string [] stack = new stack(1); pop()。system.out.pack.pop()。スタックを入力するとき、14行または15行のコードがキーです。
ランニング効果:
2。キューの作成:
キューの作成には2つの形式があります。配列構造の実装(シーケンシャルキュー)に基づいており、リンクされたリスト構造実装(チェーンキュー)に基づいています。
次に、リンクされたリストの形式でキューを作成します。これにより、拡張時にキューがより便利になります。キューがデキューになったら、ノードヘッドの先頭から開始します。
コード実装:
スタックを入力すると、通常のリンクリストにノードを追加することと同じです。
パブリッククラスキュー{パブリックノード電流; } else {current.next = new node(data); 「Queueは空です」)} node head;データ; public node(int data){this.data = data; i = 0; .out.println(queue.pop());}}ランニング効果:
3. 2つのスタックがキューを実装します。
アイデア:
Stack 1は要素を保存するために使用され、Stack 2は要素をポップするために使用され、負と負は正です。
簡単に言えば、データ1、2、および3をスタック1に入れて、スタック1(3、2、1)から出て、スタック2に入れてから、スタック2(1、2.3)からデータを配置します。キューのルールに準拠しています。つまり、ネガティブとネガティブは肯定的です。
コード実装のフルバージョン:
Import Java.util.Stack;/*** Smyhvaeが2015/9/9.*/public class queue {private stack <integer> stack1 = new stack <>(); // stack enqueue操作を実行するためのstack pr stack <integer> stack2 = new stack <>(); // dequeue操作を実行するためのスタック//メソッド:キューパブリックボイドプッシュ(int data)にエンキュー操作を追加{stack1.push(data);}//method :キューにdequeueの操作を提供しますpublic int pop()をスローします。 Stack2のデータがリリースされた)、それ以外の場合はDequeuingの順序が台無しになります。 stack1のデータとstack2 [core code]}} if(stack2.empty()){// stack2が空の場合、2つの可能性があります。 stack2のデータは、「queu is empt」をスローします。 push(1); ); out.println(queue.pop());22行目と30行目のコードの順序とコメントに注意してください。その意味を慎重に理解する必要があります。
ランニング効果:
4. 2つのキューはスタックを実装します。
アイデア:
1、2、および3をキュー1に入れてから、上位3をキュー1に残し、下部2と3をキュー2に入れ、キュー1から3を配置します。この時点で、キューは空です。キュー2は、キュー1の上位2を残し、Queue 2に残します。 。 。順番に循環します。
コード実装:
java.util.arraydeque; Import java.util.queue;/*** 2015/9/9 <integer> queue2 = new arraydeque <integer>(); // method:stack操作public void push(int data){queue1.add(data); int data; if(queue1.size()== 0){"stack is empty"); {data = queue1.poll(); queue1.poll());新しい例外をスローします( "Stack is Empty"); = new Stack(); Stack.Push.Push(3); ))stack.push(4)}ランニング効果:
5.最小関数min()でスタックを設計し、min、push、pop、およびすべての時間の複雑さがo(1)であることを必要とします。 MINメソッドの目的は次のとおりです。スタック内の最小値を返すことができます。 【ウェシャトインタビューの質問】
普通のアイデア:
一般的に言えば、このように考えるかもしれません。Min変数を使用して、要素を追加するたびにMIN要素と比較されるため、MINに保存された最小値を保証できるようにします。しかし、この場合、問題があります。最小の要素がスタックから外れている場合、残りの要素のどれが最小の要素であるかをどのように知ることができますか?
改善のためのアイデア:
ここでは、時間のためにスペースを交換するために補助スタックを追加する必要があります。補助スタックでは、スタックの上部が常に現在のスタックで最小値を保存します。特定のもの:新しい要素が補助スタックの上部要素と比較されます要素は大きいので、補助スタックの上部を補助スタックの上部にコピーします。
完全なコード実装:
java.util.stack;/*** smyhvaeが2015/9/9に作成しましたnew Stack <Integer>(); /補助if(minstack.size()== 0 || data <minstack.peek()){minstack.push};コード] PEEKメソッドは、スタックの上部に要素を返します}} public int pop()スロー例(stack.size()== 0){throw new Exception( "empty in the Stack"); data = stack.pop(); Hollow ");} return minstack.peek();} public static void main(string [] args)throws {minstack stack = new Minstack(); stack.push(4); stack.pus h(3); stack .push(5); system.out.println(stack.min());ランニング効果:
6.スタックのプッシュシーケンスとポップシーケンスが一貫しているかどうかを判断します。
簡単に言えば、データ1、2、3、4、および5のセットが順番にスタックに入れられることが知られているため、指定されたスタックが正しいかどうかを判断してください?
例えば:
データ:
1、2、3、4、5
出力1:
5、4、3、2、1(正しい)
出力2:
4、5、3、2、1(正しい)
出力3:
4、3、5、1、2(エラー)
フルバージョンコード:
Import Java.util.Stack;/*** Smyhvaeが2015/9/9に作成しました。
*/
パブリッククラススタックテスト{
//メソッド:data1配列の順序は、スタッキングの順序を示します。ここで、データ2の積み重ね順序が正しいかどうかを判断します。
public static boolean sequenceispop(int [] data1、int [] data2){
stack <integer> stack = new stack <integer>();
for(int i = 0、j = 0; i <data1.length; i ++){
stack.push(data1 [i]);
while(stack.size()> 0 && stack.peek()== data2 [j]){
stack.pop();
J ++;
}
}
stack.size()== 0を返します。
}
public static void main(string [] args){
stack <integer> stack = new stack <integer>();
int [] data1 = {1、2、3、4、5};
int [] data2 = {4、5、3、2、1};
int [] data3 = {4、5、2、3、1};
system.out.println(sequenseispop(data1、data2));
system.out.println(sequenseispop(data1、data3));
}
}
コードは比較的簡潔ですが、理解することも困難なので、注意深く理解する必要があります。
ランニング効果:
上記は、Javaのスタックとキューに関する古典的なインタビューの質問です。