-3

UVa Online Judge Question - 11995 を行っています。

デバッグする前のコードの一部を次に示します。「実行時エラー」が発生しました。

int take;
scanf("%d", &take);
int out_s;
int out_q;
int out_p;
if(sta){
     out_s = s.top();
     if(!s.empty() && out_s == take) s.pop();
     else sta = 0;
}
if(que){
     out_q = q.front();
     if(!q.empty() && out_q == take) q.pop();
     else que = 0;
}
if(pri){
     out_p = p.top();
     if(!p.empty() && out_p == take) p.pop();
     else pri = 0;
}

愚かな整数の割り当てを単純に削除した後、「受け入れられました」

int take;
scanf("%d", &take);
if(sta){
     if(!s.empty() && s.top() == take) s.pop();
     else sta = 0;
}
if(que){
     if(!q.empty() && q.front() == take) q.pop();
     else que = 0;
}
if(pri){
     if(!p.empty() && p.top() == take) p.pop();
     else pri = 0;
}

変数の代入だけで実行時エラーが発生した理由がよくわかりません。

ここに私のコード全体があります:

using namespace std;

int main ()
{
    int n;
    while(scanf("%d", &n) != EOF){
        int comm;
        stack<int> s;
        queue<int> q;
        priority_queue<int> p;
        bool sta = 1;
        bool que = 1;
        bool pri = 1;
        for(int i = 0; i < n; i++){
            scanf("%d", &comm);
            if(comm == 1){
                int input;
                scanf("%d", &input);
                s.push(input);
                q.push(input);
                p.push(input);
            }
            else{
                int take;
                scanf("%d", &take);
                int out_s;
                int out_q;
                int out_p;
                if(sta){
                   out_s = s.top();
                   if(!s.empty() && out_s == take) s.pop();
                   else sta = 0;
                }
                if(que){
                    out_q = q.front();
                    if(!q.empty() && out_q == take) q.pop();
                    else que = 0;
                }
                if(pri){
                    out_p = p.top();
                    if(!p.empty() && out_p == take) p.pop();
                    else pri = 0;
                }                
            }
        }

        if(sta == 1 && que == 0 && pri == 0) printf("stack\n");
        else if(sta == 0 && que == 1 && pri == 0) printf("queue\n");
        else if(sta == 0 && que == 0 && pri == 1) printf("priority queue\n");
        else if(sta == 0 && que == 0 && pri == 0) printf("impossible\n");
        else printf("not sure\n");
}
return 0;
}
4

1 に答える 1

4
 out_s = s.top();
 if(!s.empty() && out_s == take) s.pop();

ここでは、最初にスタックの最上位要素にアクセスし、次にスタックに実際に何かが含まれているかどうかを確認します。

変更されたコードでは、top()呼び出しはempty()論理 and によって保護されているため、コンテナーが空の場合は発生しません。

于 2013-09-03T17:50:35.590 に答える