0

だから私は、タスクを解決しようとしています。すでにコードがありますが、システム アウト、「スタック オーバーフロー」です。私は C++ が初めてで、英語が下手なので、誤解して申し訳ありません =)

   #include <iostream> 

using namespace std;

int main (){
    int n;
    int x;
    int k = 0; // счетчик для рабочего массива
    int a [200000];
 scanf("%d\n",&n);   

 for (int i = 0; i< n; ++i){
     std::cin >> x;
     if (x > 0){
             k++;
             a[k] = x;
           }else if(x == 0){
                 for (int q = 1; q <= k; ++q){ // копирование 
                          a[k+q] = a[q];
                     }
                 k *= 2;
                 }else{
                          printf("%d %d\n",a[k],k);
                          k--;
                        }
     }
     system("pause");


}

アルゴリズムは正しく動作しているように見えますが、問題はスタックだけです。どうもありがとう!

4

3 に答える 3

6

根本的な原因:

あなたが正しく推測したように、スタックは制限されており、割り当てはそれを処理するのに十分な大きさのようです。これは言語構文エラーではないため、コンパイル エラーは保証されませんが、実行時例外が発生し、クラッシュが発生します。

解決策 1:

配列をグローバルにすることができます。グローバル配列の割り当てはスタック上にないため、正常に機能するはずです。

int a [200000];

int main()
{
   .....
}

解決策 2:

あなたは使用することができますstd::vector

解決策 3:

を通じてダイナミック アロケーションを使用できますnew

于 2013-01-06T12:35:45.790 に答える
2

ステートメントint a [200000];がスタックに収まりきらないほど多くのメモリを割り当てようとしたため、スタック オーバーフローが発生しました。数キロバイトを超える配列は、ローカル変数としてではなく、動的に割り当てることを推奨する人もいます。ウィキペディアを参照してください: http://en.wikipedia.org/wiki/Stack_overflow#Very_large_stack_variables

于 2013-01-06T12:37:05.073 に答える
0

私が見ることができる3つの変更。
1 - スタックが処理できるよりも多くをスタックに割り当てています。
2 - k は常に次の空き領域を指す必要があるため、空き領域を増やすよりも更新する必要があります。
3 - インデックスは "q" の両方で "0" から始まります。

固定コード:

#include <iostream> 

using namespace std;

int a [200000];

int main (){
    int n;
    int x;
    int k = 0; // счетчик для рабочего массива
 scanf("%d\n",&n);   

 for (int i = 0; i< n; ++i){
     std::cin >> x;
     if (x > 0)
     {
             a[k] = x;
             k++; //<< change 1
     }
     else if (x == 0)
     {
         for (int q = 0; q <= k; ++q) //<<change 2
         { // копирование 
             a[k+q] = a[q];
         }
         k *= 2;
     }
     else 
     {
         printf("%d %d\n",a[k],k);
         k--;
                        }
 }
 system("pause");
}
于 2013-01-06T12:42:06.450 に答える