스택 배열로 구현하기 컴파일 에러

문제:
정수를 저장하는 충분한 크기의 스택을 구현한 뒤, 입력으로 주어지는 empty, top, push 명령어를 처리
하는 프로그램을 작성하시오.
명령어는 다음과 같이 총 3가지이다.
 empty : 스택이 비어 있으면 1, 비어 있지 않으면 0을 출력.
 top : 스택의 가장 위에 저장된 정수를 출력. 만약 스택이 비어 있는 경우, -1을 출력.
 push X : 정수 X를 스택에 삽입. (단, 1 ≤ X ≤ 10,000)
입력
첫 번째 줄에 명령어의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 두 번째 줄부터 N개의 줄에는 명령어가 하
나씩 주어진다.
출력
출력해야 하는 명령어가 주어질 때마다 그 결과를 한 줄에 하나씩 출력한다.

예제 입력
10
empty
top
push 5
push 4
top
empty
push 3
top
push 5
top
예제 출력
1
-1
4
0
3
5

C6262 스택크기에서 오류가 난다고 하는데 어떻게 처리해야 할지 모르겠습니다.
프로그램은 돌아가는데 컴파일 에러를 못잡겠습니다.

https://docs.microsoft.com/en-us/visualstudio/code-quality/c6262?view=vs-2019

스택영역(지역변수)의 메모리를 너무 많이 사용했네요. MAXVAR의 크기를 줄여보세요.


문제에서는 1 ≤ X ≤ 10,000의 범위를 줬지만, 또 스택이 비어있을 때 -1을 리턴하라고는 했지만, 비어있을 때 -1을 리턴하는 것은 스택의 역할이 아니라고 생각합니다. PS가 아니라면, 다른 방안이 필요한 상황입니다.

첫번째 버전입니다. PS라는 상황을 생각하지 않고, 스택을 구현한 클래스를 만들어, 이를 사용합니다. 코드의 재활용성은 높으나, 코드가 길다는 단점이 있습니다.

#include <iostream>
#include <string>
#include <optional>

// 크기가 다른 여러 개의 스택을 만드는 경우를 위해,
// 템플릿 파라메터로 크기를 받았습니다.
// 본격적인 용도라면 데이터의 타입도 받아 일반화하는 것이 좋습니다.
template< std::size_t N >
class ArrayStack
{
private:
    std::size_t s = 0;
    int arr[ N ] = { 0 };

public:
    std::size_t size() const
    {
        return s;
    }

    // -1을 리턴하는건 좋지 못한 습관입니다.
    // 하지만 매번 try catch 하는 것은 성능상 좋지 않기 때문에, std::optional을 사용했습니다.
    std::optional< int > push(int val)
    {
        if(s == N) return {};
        return arr[ s++ ] = val;
    }

    std::optional< int > pop()
    {
        if(s == 0) return {};
        return arr[ --s ];
    }

    std::optional< int > top()
    {
        if(s == 0) return {};
        return arr[ s - 1 ];
    }
};

int main()
{
    int N; std::cin >> N;
    ArrayStack< 1024 > stack;
    std::string instruction;
    int value;

    for(int i = 0; i < N; ++i)
    {
        std::cin >> instruction;

        if(instruction == "empty")
        {
            std::cout << (stack.size() == 0) << '\n';
        }
        else if(instruction == "push")
        {
            std::cin >> value;

            if(auto result = stack.push(value); !result)
            {
                std::cout << "Stack Overflow\n";
            }
        }
        else if(instruction == "top")
        {
            if(auto result = stack.top(); result)
            {
                std::cout << *result << '\n';
            }
            else
            {
                std::cout << "-1\n";
            }
        }
    }

    return 0;
}

두 번째 버전입니다. 이번에는 PS용입니다. 문제에서 pop 명령어가 없다는 점을 사용해, 스택 최상위의 값만 저장합니다. std::optional도 사용하지 않습니다. X의 범위를 적극적으로 이용합니다.

#include <iostream>
#include <string>

int main()
{
    int N; std::cin >> N;
    int top_val = -1;
    std::string instruction;

    for(int i = 0; i < N; ++i)
    {
        std::cin >> instruction;

        if(instruction == "empty")
        {
            std::cout << (top_val == -1) << '\n';
        }
        else if(instruction == "push")
        {
            std::cin >> top_val;
        }
        else if(instruction == "top")
        {
            std::cout << top_val << '\n';
        }
    }

    return 0;
}

해결 했습니다. 감사합니다.