2013-01-21 1 views
-1

문자열을 가져 와서 각 문자열 문자를 추가하는 스택을 만들려고 시도하고 있지만 LinkedList를 훨씬 더 효율적으로 사용한다고 들었습니다. LinkedList를 사용하여 스택을 만들고 조작하려면 어떻게해야합니까?어떻게 링크 된 목록에서 스택을 만들 수 있습니까?

예를 들어 주시면 감사하겠습니다.

+0

훨씬 효율적입니까? 왜? – Thilo

+0

@Thilo "Stack "을 수행 할 때 오류가 계속 발생합니다. – Jay

+0

Re : 계속 오류가 있습니까? 코드가 작동하지 않을 때 코드가 효율적이지 않다는 것을 어떻게 알 수 있습니까? – Thilo

답변

1

확인을 얻기는 문제입니다. 다음을 시도해보십시오

public class Example 
{ 
    private LinkedList aList = new LinkedList(); 

    public void push(char c) { 
     aList.addFirst(c); 
    } 
    public Object pop() { 
     return aList.removeFirst(); 
    } 
    public boolean empty() { 
     return aList.isEmpty(); 
    } 
    public static void main(String[] args) { 
     Stack exmpStack = new Stack(); 
     String ranString = "Dad"; 
     for (int i = 0; i < ranString.length(); i++) { 
      exmpStack.push(ranString.charAt(i)); 
     } 
     while (!exmpStack.empty()) { 
      System.out.print(exmpStack.pop()); 
     } 
    } 
} 

당신은 항상 nullFirst를 사용하지 않을 때문에 - 그래서 당신의 루프가 결코 전혀 실행하지 않습니다! 그것을 전혀 사용하지 않고 단지 isEmpty() 함수를 사용하십시오.

편집 : 물론, 당신은 정말 전혀 그 기능이 필요하지 않습니다 - 다음은 잘 작동합니다 :

public class Example 
{ 
    private LinkedList aList = new LinkedList(); 

    public static void main(String[] args) { 
     String ranString = "Dad"; 
     for (int i = 0; i < ranString.length(); i++) { 
      aList.push(ranString.charAt(i)); 
     } 
     while (!aList.isEmpty()) { 
      System.out.print(aList.pop()); 
     } 
    } 
} 

을 지금이 여전히 약간 위험한 - 당신은에 의해 한 단계를 갈 수 있습니다 사용하여 다음 :

private LinkedList<Character> aList = new LinkedList<>(); 

가 조금 더 안전하고 Character의 대신 Objects 반환 방법 - 그리고 Characters 암시 char에 캐스트 할 수 있습니다 :)

+0

AWESOME! 대단히 감사합니다 !! – Jay

+0

두 번째 예제에서 exmpStack을 제거 할 수 있습니다. –

+0

@DavidConrad 맞습니다 - 고마워요. – Jeff

0

Java의 LinkedList는 목록의 끝과 머리 부분에서 요소를 가져오고 추가하고 제거하는 효율적인 접근자를 사용하여 이중 연결된 목록이므로 이러한 메서드를 사용하여 스택을 에뮬레이트 할 수 있습니다.

+0

예제를 제공해 줄 수 있습니까? 코드가 어떻게 보이는지 모르겠습니다. – Jay

0

LinkedListVector에 의존하여 동기화 된 방법이 제공되므로 실제로 더 효율적입니다. 단일 스레드 응용 프로그램에서는 후자를 사용하면 아무런 이익이없는 동기화 가격을 지불해야합니다. 멀티 스레드 응용 프로그램에서도 동기화에 대해보다 많은 제어가 필요할 수 있습니다.

다음은 가능한 LinkedList 기반 솔루션입니다. 상속 대신 컴포지션을 사용합니다. 이렇게하면 List 관련 메서드를 사용하여 악용 될 수없는 제대로 작동하는 Stack이 제공됩니다. 귀하의 질문에서 알 수 있듯이 당신의 스택이 문자열의 문자만을 의미하는 경우

class MyStack<T> { 
    private List<T> list = new LinkedList<T>(); 

    public void push(T object) { list.add(0, object); } 

    public T pop(T object) { 
     if (isEmpty()) throw new NoSuchElementException(); 
     return list.remove(0); 
    } 

    public boolean isEmpty() { return list.isEmpty(); } 
} 

그럼에도 불구하고, 당신은 동적 문자 배열에 직접 스택을 에뮬레이트 할 수 있습니다. 나는 그것을 독자에게 연습으로 남겨 두거나 미래의 편집에서 제공 할 것입니다.

+0

숙제와 같은 고급 답변을 준 것 같습니다. -1, 친구를 가져 주셔서 감사합니다! –

+0

그게 나에게 당신에게 -1을 준 사람이 아니 었습니다. 당신의 도움에 감사드립니다. – Jay

+0

지금 당신은 -1이 아닙니다. – Jay

0

LinkedList는 스택의 작업보다 많은 작업을 제공합니다.

문자열의 문자를 푸시하고 터뜨리기 위해 스택을 사용합니다. 그러나 문자열을 삽입하는 것과 반대 방향으로 만 문자를 검색 할 수 있습니다. 이 행동을 원하면 확실합니까?

linkedlist를 사용하면 head/tail에서 데이터를 추가/검색 할 수 있습니다.

+0

예. 나는 그것을 알고 있습니다. 나는 그것에 대해 잘 알고 있습니다. – Jay

+0

나는 스택이 필요하다면 캡슐화의 원칙을 지키기 위해 스택을 제공해야한다고 주장한다. 스택의리스트 메쏘드를 제공하는 것은 에러를 초청합니다. 스택이 일반적인 계약을 거치지 않고 손상 될 수 있기 때문입니다. –

+0

@MihaiDanila 당신 말이 맞습니다. 나는 질문을 오해했다 – Hitman47

0

여기 샘플은 Stack implementation입니다. 희망이 도움이됩니다. 전혀 First를 사용하지 않을 것을

그것은 C#을 함께 이루어집니다하지만 당신은 아이디어

+0

그것은 나에게 조금 혼란 스러웠다. ... 그러나 나는 입력을 감사한다! – Jay

+0

혼란스러운 점은 무엇입니까? 아이디어는 항상 T를 먼저 추가하고 항상 연결 목록에서 첫 번째 노드를 제거하는 것입니다. – DarthVader

관련 문제