배열을 이용한 스택 구현 c++ (초보프로그래머입니다.)

초보 프로그래머 입니다.조건은
입력
첫번째 줄에 명령어의 수 N (1 ≤ N ≤ 1 0 0, 000) 이 주어진다 두 번째 줄부터 N 개의 줄에는 명령어가 하
나씩 주어진다
출력
출력해야하는 명령어가 주어질 때마다 그 결과를 한 줄씩 출력한다.
얘를들어 push 10을 하면 10이 출력되고
pop을 하면 제거되는 top을 출력하는 구조입니다.
예외처리 하는 부분이랑 str과 X를 입력 받았을때 pop과 print는 동작을 안하는데
어떻게 구현해야할지 감이 오지 않습니다.
코드를 열심히 짜봤는데 부족하지만 조언 부탁드립니다.

pushNum > 100000 && pushNum < 0…?
한번만 다시 생각해 보십시오…

stack 클래스에서는 데이터만 다루고, 출력 부분은 클래스 밖에서 하는게 OOP 원칙에 맞겠죠. 오버플로/언더플로 예외는 std::optional같은걸루 하고.

그리고 제발 using namespace std좀 쓰지 마세요. 이름이 겹치지 않는다는 보장이 있습니까? 마침 지금 stack 헤더에 std::stack이 있는데…

까먹고 안지우신 거겠지만 stack 클래스 안에 str 지워주시고, stack::print에서 int ifor 안에 넣어주세요.

생성자에서 top = -1보단 그냥 처음부터 -1로 초기화해 주세요.

반복문에서 i++ 대신 ++i를 사용해 주세요. 지금 당장 같은 성능이라 해도 꼭 들여야 하는 습관입니다.

계속 입력받는 변수의 이름에 X는 어울리지 않습니다. 정답은 없지만, C++ 네이밍 컨벤션 찾아보세요.

1 Like

답변 감사합니다 고쳐보겠습니다.

스택이 비어있는지 꽉차있는지 확인하는 함수를 만드는건 어떨까요??

i++ 과 ++i 차이는 for문이나 그냥 쓰일 경우 예 : some_value++; 컴파일러 단계에서 초기화 되지 않나요?

최적화 해주는 것도 요즘 컴파일러가 똑똑하고 라이브러리가 잘 짜여있어서 그런거죠. 타수가 적거나 가독성이 좋은 것도 아니고, i++할 이유가 전혀 없습니다.

네 최적화가 컴파일러에 의존적이니 복사 생성자 호출이 필요하지 않는다면 primitive한 타입이라도 ++i가 맞긴하죠. 제발 using namespace std 좀 쓰지 마세요. 보고 제 글도 아닌데 괜히 딴지 걸었네요. 죄송합니다

참고로, 요즘에는 반복자에서까지 i++가 최적화됩니다. 예를 들어, GCC에서 std::vector< T >::iterator__gnu_cxx::__normal_iterator< T*, std::vector< T > >로 정의되어 있는데, 요놈의 연산자들은 전부 T*의 연산자에 의존합니다. 고로 최적화. 그래도 늘 그렇다는 보장이 없으니 ++i를 사용하는 것입니다.


using namespace std 말씀하셨는데, 이를 지양하는 것은 타수를 줄임으로서 얻는 이득보다 잠재적인 버그로 인한 손실이 크기 때문입니다.

using namespace std 로 생기는 이름 겹침 문제 떄문이 아니라 혼내는 듯한 말투 때문에 한 소리입니다.
나머진 알고 있습니다

1 Like

i++ 할 이유가 전혀 없습니다. ’
요오건 조금 개인 취향차이가 있을거같네요
마치 if , for문에서 코드블럭을 한칸 띄우냐 마냐같은 문제하고 비슷하네요
물론 엄청 극한의 상황에선 ++i 해야하지만
요즘 자바도 문자열 concatenation 할때도 최신 java환경에선 +가 StringBuilder보다 더 낫지만
옛습관이나 개인 취향에 따라서 갈리는 것 처럼요

++i, i++는 iterator 같은 타입 아니면 별 상관은 없습니다.

non-primitive type일 때 i++ : 이득은 없고 성능상 손해는 있음
primitive type일 때 i++ : 이득이 없지만 손해도 없음 (현업에서 고대 유물에 가까운 수십년 된 컴파일러를 쓸 일은 사실상 없습니다)

이러면 primitive type일 때 i++을 선호해야 할 이유는 없지만, 굳이 ++i를 써야 할 이유 또한 없는 것이죠

unsigned vs signed war 정도면 그럴수 있는데…
i++ vs ++i, char* p vs char *p, tab vs whitespace, func () { vs func () \n { 같은 논쟁은 불필요하다 느껴지네요

primitive type일 땐 i++ 쓰다가 non-primitive type일때만 ++i로 바꿔쓰는건 그것대로 이상한짓 아닌가요. 스타일은 하나로 고수~

불필요한 논쟁임에는 동의합니다. 다만, 후자의 것들은 취향 차이라 그렇지만 ++i는 답이 명확하다고 생각합니다.

뭐 그거야 취향차지요… 저는 전치 표현이 보이는 순간 이건 iterator 들어간 코드겠구나라고 생각하는 습관이 들어서 ++iter 등에만 쓰며 이 경우에는 변수명을 한글자 이외의 여러 글자로 쓰는 편입니다

2 Likes