переполнение стека переполнение стека

Итак, я пытаюсь решить задачу.
У меня уже есть код, но системные выходы, «переполнение стека» Я новичок в 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");}

похоже, алгоритм работает правильно, но единственной проблемой является стек. большое спасибо!

0

Решение

Первопричина:

Как вы уже догадались, стек ограничен и, кажется, ваше распределение достаточно велико, чтобы его можно было обработать. Это не ошибка синтаксиса языка, поэтому она не гарантирует ошибку компиляции, но приводит к исключению времени выполнения, что приводит к сбою.

Решение 1:

Вы можете сделать массив глобальным, выделение глобального массива не в стеке, поэтому он должен работать нормально:

int a [200000];

int main()
{
.....
}

Решение 2:

Вы могли бы использовать std::vector

Решение 3:

Вы можете использовать динамическое распределение через new,

6

Другие решения

утверждение int a [200000]; пытается выделить больше памяти в стеке, чем умещается, что вызвало переполнение стека. Некоторые люди рекомендуют, чтобы массивы размером более нескольких килобайт выделялись динамически, а не как локальная переменная. Пожалуйста, обратитесь к Википедии: http://en.wikipedia.org/wiki/Stack_overflow#Very_large_stack_variables

2

3 изменения я вижу.
1 — выделяет в стеке больше, чем может обработать стек.
2 — k всегда должен указывать на следующее свободное место, поэтому вам нужно обновить его, а не увеличивать.
3 — индексы начинаются с «0» и для «q» для.

Фиксированный код:

#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");
}
0
По вопросам рекламы [email protected]