2017-12-08 18 views
-5

C++でStacksを使用しているときに私はよく気付いていますが、問題の根本的な根拠は不明です。それは、より良いコードのスニペットで説明することになります(私はいつものようになどポップ/スタックの最小値を取得しようとプッシュしています)C++のスタック: "or"条件を切り替えるとランタイムエラーが発生する

class MinStack { 
private: 
    stack<int> ans; 
    stack<int> min_collector; 

public: 
    void push(int x) { 
     ans.push(x); 
     if (min_collector.empty() || getMin()>=x) { 
      min_collector.push(x); 
     } 
    } 

    void pop() { 
     if (ans.top()==getMin()) { 
      min_collector.pop(); 
     } 
     ans.pop(); 
    } 

    int top() { 
     return ans.top(); 
    } 

    int getMin() { 
     return min_collector.top(); 
    } 

};

上記のコードは正常に動作します。私が編集している場合しかし、プッシュ(int型x)関数では、このような状態「場合」:

(getMin()>=x || min_collector.empty()) 

私はランタイムエラーを取得し、他の誰がこの問題に直面していますか?なぜ "または"状態の順序が重要なのでしょうか?

+3

スタックが空のときに 'min_collector.top()'に何が起こると思いますか? – tkausl

+1

「なぜ注文を行うべきか」または「条件が関係するのはなぜですか?」短絡があるので:https://stackoverflow.com/questions/1799072/c-short-circuiting-of-booleans – Slava

答えて

2

これらの条件は左から右に評価され、最初の用語がtrueを返すと実行が中止されます。

ロジックの場合、&&最初の期間がfalseに戻ったら、実行が中止されます。

が空だとき、スタックのtop()要素にアクセスしようとすることは違法であるので、あなたは、ランタイムエラーを取得する - 何のトップ要素がありません。

+0

ありがとう、私は "短絡"の原則に精通していませんでした。 –

関連する問題