신짱구의 개발일지

[C++] 스택 크기 오류 본문

C++

[C++] 스택 크기 오류

신짱구개발자 2024. 9. 14. 23:03

스택을 사용한 알고리즘 문제에서 다음과 같이 코드를 작성하고 스택의 크기를 출력했지만, 4294967295 라는 터무니 없는 값이 출력되었다. 

else if (str == "pop") {
	if (st.empty()) cout << -1 << endl;
	else cout << st.top() << endl; st.pop();
}

문제의 원인

문제의 원인은 else 블록에서 두 구문을 한 줄에 작성하여 의도대로 실행되지 않은 것이다. 조건문을 대괄호 없이 사용할 때는 하나의 구문만 허용되고, 그 이상 부터는 조건문과 관계없이 무조건 실행되버린다. 위 코드에서 스택이 empty() 함수에 걸려도 pop() 함수가 if-else 레벨에서 다음으로 실행되었던 것이다. 그래서 허무하게도 pop() 함수 호출하는 구문을 개행해주니까 문제가 해결되었다.

 

위와 같은 사소한 실수로 인해, 한 가지 알게된 것이 있다.

스택 언더플로우

std::stack에서 size() 함수는 항상 unsigned 타입의 값을 반환하기 때문에 음수로의 표현은 불가능하다. 그렇기 때문에 스택이 비어 있을 때 pop() 함수와 같은 스택의 크기를 줄이는 로직은 스택의 크기를 -1로 변경하려 한다. 그러나, 스택의 크기는 음수가 될 수 없기 때문에 unsigned int 타입으로 변환되면서 최대값인 4294967295로 표시된다.

 

그러하여, 위와 같은 상황에서도 이미 스택의 크기가 0 이었음에도 pop() 함수를 실행했기 때문에 4294967295 값이 출력되었던 것이다.

 

혹시나 나와 같은 문제가 발생한 사람들에게 도움이 되길 바란다!