콘텐츠로 건너뛰기

연결리스트와 스택 과제

블로그에 코드는 다시는 올리지 않으려고 했는데 에라~ 모르겠다~

오늘 자주 들르는 커뮤니티에 고민 글이 하나 올라왔다. 고민인즉!!
전공수업에서 교수님이 C언어 과제를 하나 내 주셨다.

문제> “단어1 단어2 단어3 단어4” 를 입력 받으면 스택과 연결리스트를 이용하여 저장한 후
         “단어4 단어3 단어2 단어1″의 형태로 출력을 하는 프로그램을 작성하시오.
 
e.g>입력 : I Love You
      출력 : You Love I

연결리스트와 스택 과제
연결리스트와 스택 과제

자료구조 수업인 것 같은데 입력 받은 문장을 공백을 기준으로 분리해서 스택에 과 연결리스트를 이용해 저장한 후 출력하는 문제이다.

3년만에 학교를 복학해서 C언어와 자료구조 동강까지 보면서 공부를 해 봐도 풀리지가 않아서 고민 글을 쓰게 된 것이다. 얼마나 고민이 되었을까.. 문제는 안풀리고 마냥 답답했나보다..ㅠㅠ

정말 도와주고 싶었지만… 코드를 C로 작성해야 한다는 제약사항이!! C언어는 2학년때 이후로 본지가 오래되어서 자주 쓰이는 함수들 이름조차 다 까먹었는데…..;;; 아… 슬프다. 도와줄 방법이 없구나. 문제를 딱 보니 스택은 LIFO(Last In, First Out)형태의 자료구조이니 스택에 먼저 입력 받은 문장을 단어로 나누어 넣은 후 스택에 들어있는 단어들을 차례대로 꺼내서 연결리스트에 넣는 문제라는 감은 왔는데….

그래서 미약하나마 힘이 되고자 가장 손에 익은 언어인 자바로 코드를 만들어서 답변으로 올려 두었다. 사실.. 자바나 C나 문법만 약간 다를 뿐.. 내용물은 비슷비슷 할 테니 힌트라도 되지 않을까 생각되었다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Stack;




public class Test {
   
    /**
     * 문자배열을 인수로 받아
     * 스택에 넣어 스택을 리턴
     * @param words
     * @return
     */
    public Stack pushStack(String[] words){
        Stack stack = new Stack();
        for(int i = 0; i < words.length; i++){
            stack.push(words[i]);
        }
        return stack;
    }
   
    /**
     * 스택을 인수로 받아
     * 연결리스트에 넣어 연결리스트를 리턴
     * @param stack
     * @return
     */
    public LinkedList addLinkedList(Stack stack){
        LinkedList linkedList = new LinkedList();
        while(!stack.empty()){
            linkedList.add(stack.pop());
        }
        return linkedList;
    }
   
    /**
     * 단어들을 입력받아 공백을 기준으로
     * 문자들을 배열에 저장
     * 배열을 리턴
     * @return
     * @throws IOException
     */
    public String[] inputWords() throws IOException{
        String[] words = null;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try{
            System.out.print("입력 : ");
            words = br.readLine().split(" ");
        }catch(IOException e){
            System.out.println(e);
        }finally{
            if(br != null) br.close();
        }
       
        return words;
    }
   
    public static void main(String[] args) throws IOException {
        Test test = new Test();
       
        Stack stack = test.pushStack(test.inputWords());    //문자를 입력받아 스택에 저장
        LinkedList linkedList = test.addLinkedList(stack);    //스택의 값을 연결리스트에 저장
       
        //연결리스트의 값을 차례대로 출력
        System.out.print("출력 : ");
        for(int i = 0; i < linkedList.size(); i++){
            System.out.print(linkedList.get(i)+" ");
        }
    }
}

도움이 되었으면 좋겠다. 정말루…;;

만약 연결리스트와 스택도 직접 구현해서 사용해야 하는 문제라면, 어짜피 책에 간단한 스택과 연결리스트의 예제 소스가 있을 테니 그걸 참고하면 될 테고.. 문자열을 나누는 sprit()메소드는 C언어에도 비슷한 역할을 하는 함수가 있을 테니 그걸 찾아다 쓰면 될 것 같다.

부디 꼭 성공하세요!! 싸인펜이 응원합니다!!


10 개의 댓글

    1. 헉!! 문제가 그것일 수도 있겠네요..;;

      저희학교 교수님이 내 주신 문제라면 교수님께 문제를 다시한 번 여쭈어 볼 수도 있을텐데.. 그게 아니라서..;;

      화현님이 이해하신대로의 문제라면 연결리스트에 단어들을 넣을 때 마다 연결리스트의 첫번째 인덱스에 값을 추가하면 스택처럼 동작할것 같은데, 그렇게 문제를 풀어 나가야 할 것 같은데요.

      그 분…. 어떻하죠?? 덜덜덜…

    1. 그 분께서 밤을 새워서라도 과제를 하겠다는 댓글을 확인했습니다^^ㅋ

      자바 소스이긴 하지만, 참고가 될 것 같다고 하시네요.

    1. C++은….. OTL

      제 컴퓨터에 C++컴파일러도 설치되어 있지 않고, 게다가 C나 C++쪽은 제가 약해서… 아마 한참 걸릴 것 같습니다…;;

      제가 도움이 되지 못할 것 같아요. 그런데 과제가 같은가봐요??

    1. 이거 난감하네요..ㅠㅠ 도움을 드려볼려고 뚝딱거려 본건데 오히려 잘못된정보로 피해만 가게 생겼습니다….;;

      화현님의 댓글과 루미넌스님의 댓글을 모두 보고 곰곰히 생각해 봤는데 두 분께서 말씀하시는 내용이 맞는것 같아요. 이를 어쩌죠..;;

  1. LIFO 아닌감? Last In First Out 후입선출 ㅋㅋㅋ 수정요망 뭐그거나 이거나 마찬가지긴 하지만 그렇고 아무것도 쓰지 않은상태에서 애드센스 신청했다가 짤렸당. ㅋㅋ

    1. 으하하~ 이런 실수가!!
      그냥 머릿속에 떠오르는대로 적었더니 잘못 적었나보네..ㅎㅎ

      애드센스 실패했으면 다음에서도 애드센스처럼 애드클릭스라는 서비스를 하고 있으니까 그 쪽도 한번 알아봐바~ 괜찮은 것 같던데~

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다