ji-kim님의 조언에 따라 push와 pop 함수부터 만들기로 했다.
push와 pop 함수를 따로 작성하려고 했다. push를 할 때 새로운 노드를 만들어서 스택에 추가해주고 그걸 top으로 지정하면 되겠구나 싶었다. 근데 이렇게 하면 push할 노드의 정보가 필요하니까, pop을 먼저 하면 안 되고 나중에 해야겠구나 싶었다. 그래서 push할 노드를 인자로 넣어줘서 push를 해주고, 그 다음에 그 노드를 pop하면 되겠다고 생각했다.
그런데..! 뭔가 좀 복잡한 것 같고 자꾸 헷갈리기도 해서 다시 잘 생각해봤다. 원래 있던 노드를 그대로 이용하면 되지 않을까? 노드를 삭제하고 새로 생성하고 이러지 않고 그냥 연결만 바꿔주는 것이다. 새로 할당하면 free()
를 해야 하는데 그거 생각하기 귀찮으니까 이게 낫겠다 싶어서 이렇게 바꿨다. 그래서 하나의 함수에 다 작성했다.
인자로는 스택 a
와 스택 b
를 받아왔다. from
과 to
로 이름을 지어서 from
에서 pop해서 to
에 push하게 작성했다.
먼저, from
이 비어있을 때는 아무것도 실행하지 않으면 되기 때문에 그냥 리턴했다.
이 다음에 from
에 노드가 하나만 있었을 때와 여러 개가 있었을 때를 나눠서 작성했다. from
에 노드가 하나만 있으면 pop하고 나서 빈 노드가 되기 때문에 경우를 나누는 게 좋겠다고 생각했다. 각 경우에서는 또 다시 to
가 비어있을 때와 그렇지 않을 때를 나눠서 작성했다.
from
에 노드가 하나만 있을 때를 먼저 보겠다. 우선 to
가 비어있을 때는 from->top
이 to->top
이 되고, 그 to->top
이 곧 to->bottom
이 된다. to
에 노드가 하나라도 있었다면, to->top->prev
에 from->top
을 연결해주고, 그 form->top->next
에 to->top
을 연결해준다. 그리고 to->top->prev
가 이제 to->top
이 된다.
그림을 넣고 싶은데 만들기 귀찮다. 나중에 시간되면.. 안 귀찮을 때 만들어보겠다.
push하고 pop하는 함수가 잘 작동하긴 하는데 왠지 코드에 자신이 없다.
뭔가 조건문이 많아지면 야매로 한 것 같은 느낌이 든다.
일단은 다 만들었으니까 이제 최대한 빨리 기능들 구현해야겠다.