연결리스트와 스택 과제

프로그래밍 2007/10/04 01:44
  블로그에 코드는 다시는 올리지 않으려고 했는데 에라~ 모르겠다~

  오늘 자주 들르는 커뮤니티에 고민 글이 하나 올라왔다. 고민인즉!!
  전공수업에서 교수님이 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언어에도 비슷한 역할을 하는 함수가 있을테니 그걸 찾아다 쓰면 될 것 같다.

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

트랙백 주소 :: http://signpen.net/blog/trackback/2510833

자바의 포인터?

프로그래밍 2006/12/18 01:41

  요즘 집에 있는 자바와 C언어 책을 번갈아 가면서 보고 있습니다. C언어 공부도 조금 해 볼겸, 자바 책도 함께 보고 있는데요. 겸사겸사 몇 가지 실험 및 연구도 함께 하고 있습니다.

  자바에서 사라진 포인터가 어디쯤에 붙어 있는지에 대해서 알아보고 있습니다. 명시적으로 포인터를 선언해서 사용하지는 않지만 분명 다른 변형된 모습으로 사용되고 있으니까요. 그걸 뒷조사 하고 있습니다. 그냥 이래저래 재미 있습니다^^ㅋ

  그리고 자바에서는 구조체의 형태를 왜 클래스란 이름으로 사용하는지, 구조체와는 다른 클래스의 장점이 무엇인지도 조금 봐 두었구요. 컬렉션인터페이스 부분도 조금 관심있게 살펴보고 있습니다. Vector는 학기 중에 채팅프로그램 서버에서 사용되어서 만져보긴 했지만 Hashtable은 처음 보는 거네요. 이름 그대로 Hash알고리즘을 토대로 비슷하게 구현된 것 같은데 시간이 없어서 대강 보기만 했습니다.

  외에도 C언어의 포인터, 배열 등도 함게 보고 있는데, 재미있네요^^ㅋ 포인터를 학기 중에 배우긴 했었지만 뭐가뭔지 모르는 상태에서 배운 것이라 머릿속에 수업에 필요한 부분만 대강의 스케치만 만들어서 레포트를 작성하고 수업도 들었었는데 이제서야 자세하게 살펴보고 있습니다.

int* p;
int *p;

둘 중에 의미적으로 따지면 왜 첫번째 것이 더 맞는 것인지도 이제서야 이해 했거든요...;;

조금씩 공부는 하고 있는데 여러 일들로 계속 흐름이 끊겨서 장시간 보지는 못하고 있었습니다. 조만간 머릿속에 조금씩 정리 되는대로 블로그에도 다시한번 정리해서 올려야 겠습니다.S

top
     TAG C언어, 자바, 포인터

트랙백 주소 :: http://signpen.net/blog/trackback/2510685

  1. 트랙백 발송지 : 루미넌스 - miscellaneous 2006/12/19 12:47 삭제

    제목 : C/C++ 포인터에 대한 몇가지 다른 설명

    C/C++을 공부하는 입장에서 포인터는 정말이지 난해하기 짝이없는 개념이다. 하지만 모두가 입을 모아 포인터는 꼭 이해하고 능숙하게 다룰수 있어야 한다고 말하니 더욱 난처하다. 내 경우에는 C를 고등학교때(중학교때였나?ㅡㅡㅋ) 처음 공부를 시작했는데 번번히 포인터 개념을 잡지못해서 좌절하고 책을 덮어버렸던 기억이 난다. 그러다가 대학 1학년때 차 모 교수님께서 '컴퓨터의 기초'과목 수업중에 흘리듯이 하신 얘기가 귀에 꽂혀버려서 그 이후로 지금까지 큰..

요즘 보고 있는 책입니다.

프로그래밍 2006/12/16 01:59
C프로그래밍
  언제쯤 구입했었던 책이었는지 잘 기억이 나질 않습니다. 어렴풋이 중학교때 쯤이 아닐까 추측하고 있을 뿐입니다. 제가 중학교 2학년때 처음 저희집에 컴퓨터라는 물건이 생겼었거든요. 아마 집에 컴퓨터라는 물건이 생기면서 무언가 공부해 보고 싶어서 구입했던 책 같습니다.

  C언어에 대해서 알고는 싶었지만 마땅히 배울만한 자료가 없어서 동네 서점에서 눈에 띄는 책을 하나 구입 했습니다. 설레는 마음으로 책을안고 집으로 돌아와 책을 펼쳐 보았습니다.

그런데 웬일입니까. 무슨 말인지 전혀 알지 못하겠는 겁니다. 책과 함께 부록으로 들어있던 디스켓의 내용물을 보면 무언가 좀 알 수 있지 않을까 하는 마음에 컴퓨터에 디스켓도 넣었습니다. 디스켓에 있는 파일들을 실행 해 보니 도스 화면에 단어 몇 개가 출력되고는 프로그램이 종료됩니다. 게다가 생전 처음보는 .C라는 이름의 확장자를 가진 파일들만 가득하고 말이죠. 이틀정도 알지는 못하지만 내가 프로그래밍의 고수라도 된 느낌에 책을 뒤적거려 보고 디스켓에 있는 파일들을 실행 해 보다가 결국 흥미를 잃고 책은 영원히 책장속에 봉인이 됩니다. 그것도 눈에 아주 잘 띄는 위치다 보관을 합니다. 친구들이 놀러 왔을때 책을 발견하곤 나를 프로그래밍의 고수라고 생각하지 않을까 하는 마음에 말이죠.

  초등학교 시절 컴퓨터 학원을 다니면서 GW-BASIC을 배웠습니다. 이게 무엇을 하는 것인지도 모르고 단지 컴퓨터를 배우고 싶어서 학원을 다녔었죠. 조금씩 하다 보니 흥미도 생겼습니다. 친구들이 어디서 구해왔는지 BASIC으로 만들어진 게임 소스도 디스켓으로 구해다가 가져 오더군요. 재미를 붙이고 열심히 배웠지만, 전 BASIC안에서 RUN이란 명령어로 실행되는 프로그램이 아닌 EXE라는 확장자를 가지고 도스화면에서 파일명을 타이핑하고 엔터를 입력하면 실행이 되는 프로그램을 만들고 싶었습니다. EXE파일로 만들어지는 프로그램이 아니니 제가 만든것은 프로그램이 아니라고 생각하고 있었습니다.

  그리고 시간이 흘러 중학교시절 첫 컴퓨터가 생기고 저도 프로그래밍이라는 것을 본격적으로 공부 해 보고 싶었습니다. 친구들에게 C언어라는 것으로 프로그램을 만들면 EXE파일로 프로그램이 만들어 진다는 이야기를 들었습니다. 이젠 RUN이 아닌 EXE라는 확장자가 붙어있는 프로그램을 만들고 싶었졌습니다. 그런데 저 책 한권으로 인해서 프로그래밍과는 긴 시간동안 멀어져서 지내게 되었습니다. 컴파일이라는 것의 개념도 알지 못했고, 무엇으로 코드를 작성해야 하는지도 모르고 있었는데 저 책은 그것들을 가르쳐주고 있지 않았거든요.


  이번에 방학을 하고 집에서 책을 정리를 하던 중, 제 추억속의 책을 발견 했습니다. 요즘 조금씩 들여다 보고 있는데, 어렸을적 그 어려웠던 책의 내용이 이제서야 눈에 보이는군요. 어렸을적 저에게는 당연히 어려웠을 수 밖에 없었네요. 저건 C언어 기초를 배우기에는 매우 부적절한 책이거든요. 책은 C언어 기초가 아닌 알고리즘에 대해서 설명하고 있네요. 책의 맨 처음, 첫번째 예제에서는 C언어로 구조적인 프로그램을 짜는 부분에 대해서 설명하고 있고 두번째에는 배열을 이용한 예제 프로그램에서 그 프로그램의 알고리즘과 배열에서 영문과 한글 문자열 처리 방식을 어떻게 해야 하는지에 대해서 설명하고 있네요.

  당시에 저 책이 아닌 다른 책을 접했더라면, 그래서 중학교 때 부터 프로그래밍에 관심을 가지고 꾸준히 공부 해 왔었다면 지금의 제 모습이 어떻게 변해 있을까 하는 생각과 함께 여러가지 생각들이 머릿속에 떠오르네요^^ㅋ

2D 디스켓

부록으로 들어있는 5.25인치 2D 디스켓

  마지막으로 보너스 사진입니다. 초판 발행일이 1995년도 책이다 보니 부록이 CD가 아닌 요즘에 보기 힘든 5.25인치 2D 디스켓으로 들어 있습니다. 2HD도 아닌 2D 디스켓에 책의 모든 예제 소스가 들어있다니!! 요즘 같아선 상상도 하기 힘든 일이 당시엔 가능 했었습니다. 16M의 메인메모리를 장착하고 있는 제 첫 컴퓨터를 보고 친구들은 고용량의 슈퍼컴퓨터라고 하곤 했었으니까요^^S
top
     TAG C언어, , 프로그래밍

트랙백 주소 :: http://signpen.net/blog/trackback/2510684