2017-08-20 14 views
0

で練習するとき、私はいくつかの奇妙なエラーに会いました。 私の解決策は以下の通りです:私はキュー、<a href="https://leetcode.com/problems/implement-queue-using-stacks/description/" rel="nofollow noreferrer">Description</a>を実装するためにスタックを使用しようとLeetCode

class MyQueue { 
public: 
    /** Initialize your data structure here. */ 
    stack<int> my_stack; 
    MyQueue() { 

    } 

    /** Push element x to the back of queue. */ 
    void push(int x) { 
     stack<int> my_new_stack; 
     my_new_stack.push(x); 
     for(int i = 0; i < my_stack.size();i++){ 
      my_new_stack.push(my_stack.top()); 
      my_stack.pop(); 
     } 
     for(int i = 0; i< my_new_stack.size();i++){ 
      my_stack.push(my_new_stack.top()); 
      my_new_stack.pop(); 
     } 
    } 

    /** Removes the element from in front of queue and returns that element. */ 
    int pop() { // what about queue is empty 
     int temp = my_stack.top(); 
     my_stack.pop(); 
     return temp; 
    } 

    /** Get the front element. */ 
    int peek() { 
     return my_stack.top(); 
    } 

    /** Returns whether the queue is empty. */ 
    bool empty() { 
     return my_stack.empty(); 
; 
    } 


}; 

/** 
* Your MyQueue object will be instantiated and called as such: 
* MyQueue obj = new MyQueue(); 
* obj.push(x); 
* int param_2 = obj.pop(); 
* int param_3 = obj.peek(); 
* bool param_4 = obj.empty(); 
*/ 

結果は、私はそれは知っている [null,true,null,null,null,1,0,80] 真の結果が [null,true,null,null,null,1,2,3]

である一方、私のテストケースが

["MyQueue","empty","push","push","push","pop","pop","pop"]
[[],[],[1],[2],[3],[],[],[]]

です私は効率的ではないが、私は実際にどこから080が分からないのでしょうか?

は一種の助けをありがとう

+1

Eric Lippertの[小さなプログラムのデバッグ方法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を読んで、デバッガの使い方そして私たちの助けが必要な場合は、あなたに[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)を提案し、[最小、完全、および検証可能]例](http://stackoverflow.com/help/mcve)。 –

答えて

3

はこれを非常に注意深く見て:!

for(int i = 0; i < my_stack.size();i++){ 
    my_new_stack.push(my_stack.top()); 
    my_stack.pop(); 
} 

と自分自身に思う:私のi < my_stack.size()条件の結果がループを通るたびにどのようなものです。ヒント:必ずしもスタックの元のサイズではありません。

あなたは限りmy_stackが空ではなかったようmy_new_stackmy_stackから転送オフはるかに良いだろう!

そして、はい、その単語が理由で強調されて、私はまた、あなたがこのスキームは、もう少し効率的に作ることができるということを指摘したいと思います


:-)ウインクウインクを微調整微調整。スタックは常に抽出の準備が整った状態に保ちます。しかし、抽出する前に何千ものアイテムを挿入するとどうなるか考えてみてください。

これは、2千ののすべてのアイテムの逆転です。

はるかに良いでは現在のモード(挿入または抽出物)を保存し、あなたがする必要があるときにのみ、逆にするだろう。たとえば、次の擬似コードを

を参照してください。

def init(): 
    # Initialise in insert mode. 

    stack = [] 
    mode = mode_insert 

def reverseStack(): 
    # Transfer all items to get reverse order. 

    newStack = [] 
    while not stack.empty(): 
     newStack.push(stack.top()) 
     stack.pop() 

    # Use reversed stack now. 

    stack = newStack 

    # Change mode. 

    if mode == mode_insert: 
     mode = mode_extract 
    else mode = mode_insert 

def insert(item): 
    # Put stack in right state and add the item. 

    if mode == mode_extract: 
     reverseStack() 
    stack.push(item) 

def extract(): 
    # Put stack in right state then get item out. 

    if mode == mode_insert: 
     reverseStack() 
    item = stack.top() 
    stack.pop() 
    return item 

あなたは挿入の間で交互している場合は、長い同様の操作を実行し、わずかに少ない効率的なを持っている場合、これは実際に、実質的により効率的になり、抽出。

+0

ありがとうございました!私はポイントを得たと思う。 'my_stack'のサイズは全てのループで変わります!そして最適化も良い考えです。 –

1

最初はpushメソッドに論理エラーがありますので、交換後に新しいint値をmy_stackの最後にプッシュする必要があります。

第二に、stack.size、機能()、それは常に変化し、あなたには、いくつかの要素を失ったように、あなたは、私が同時に++を使用、不変ではありませんインチ私はしばらく好む。

私は英語が得意ではないですし、あなたが私をundersandことができると思います。

関連する問題

 関連する問題