자바 스택에 대한 빠른 가이드

1. 개요

이 빠른 기사에서는 java.util.Stack 클래스를 소개하고 어떻게 사용할 수 있는지 살펴 보겠습니다.

스택 은 LIFO (last in, first out) 개체 컬렉션을 나타내는 일반적인 데이터 구조로, 일정한 시간에 요소를 푸시 / 팝할 수 있습니다.

새로운 구현의 경우 Deque 인터페이스와 그 구현을 선호해야합니다 . Deque 는보다 완전하고 일관된 LIFO 작업 집합을 정의합니다. 그러나 특히 레거시 코드에서 Stack 클래스 를 처리해야 할 수도 있습니다 . 더 잘 아는 것이 중요합니다.

2. 스택 생성

인수가없는 기본 생성자를 사용하여 Stack 의 빈 인스턴스를 만드는 것으로 시작하겠습니다 .

@Test public void whenStackIsCreated_thenItHasSizeZero() { Stack intStack = new Stack(); assertEquals(0, intStack.size()); }

이렇게하면 기본 용량이 10 인 스택생성 됩니다 . 추가 된 요소 수가 전체 스택 크기를 초과하면 자동으로 두 배가됩니다. 그러나 요소를 제거한 후에도 크기가 줄어들지 않습니다.

3. 스택 동기화

StackVector 의 직접 하위 클래스입니다 . 이것은 수퍼 클래스와 유사하게 동기화 된 구현 임을 의미합니다 .

그러나 동기화가 항상 필요한 것은 아닙니다 . 이 경우 ArrayDeque 를 사용하는 것이 좋습니다 .

4. 스택에 추가

의 상단에 요소를 추가하여하자의 시작 스택 으로, 푸시 () 방법 - 또한 추가 된 요소를 반환합니다 :

@Test public void whenElementIsPushed_thenStackSizeIsIncreased() { Stack intStack = new Stack(); intStack.push(1); assertEquals(1, intStack.size()); }

하여 푸시 () 메소드를 사용하여 동일한 효과를 갖는다 addElement을 (). T 그 유일한 차이점이다 addElement ()를 대신 첨가되는 요소의 동작 결과를 리턴한다.

한 번에 여러 요소를 추가 할 수도 있습니다.

@Test public void whenMultipleElementsArePushed_thenStackSizeIsIncreased() { Stack intStack = new Stack(); List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7); boolean result = intStack.addAll(intList); assertTrue(result); assertEquals(7, intList.size()); }

5. 스택에서 검색

다음으로 Stack 에서 마지막 요소를 가져오고 제거하는 방법을 살펴 보겠습니다 .

@Test public void whenElementIsPoppedFromStack_thenElementIsRemovedAndSizeChanges() { Stack intStack = new Stack(); intStack.push(5); Integer element = intStack.pop(); assertEquals(Integer.valueOf(5), element); assertTrue(intStack.isEmpty()); }

Stack 의 마지막 요소를 제거하지 않고도 얻을 수 있습니다 .

@Test public void whenElementIsPeeked_thenElementIsNotRemovedAndSizeDoesNotChange() { Stack intStack = new Stack(); intStack.push(5); Integer element = intStack.peek(); assertEquals(Integer.valueOf(5), element); assertEquals(1, intStack.search(5)); assertEquals(1, intStack.size()); }

6. 스택에서 요소 검색

6.1. 검색

스택을 사용하면 요소를 검색 할 수 있습니다.그리고 상단에서 거리를 얻으십시오.

@Test public void whenElementIsOnStack_thenSearchReturnsItsDistanceFromTheTop() { Stack intStack = new Stack(); intStack.push(5); intStack.push(8); assertEquals(2, intStack.search(5)); }

결과는 주어진 객체의 인덱스입니다. 둘 이상의 요소가있는 경우 하나 의 색인상단에 가장 가까운 값이 반환 됩니다. 스택 맨 위에있는 항목은 위치 1에있는 것으로 간주됩니다.

객체가 없으면 search () 는 -1을 반환합니다.

6.2. 요소 색인 얻기

의 S의에 요소의 인덱스를 얻으려면 압정을, 우리는 또한 사용할 수 있습니다 같이 IndexOf ()lastIndexOf에서도를 () 방법 :

@Test public void whenElementIsOnStack_thenIndexOfReturnsItsIndex() { Stack intStack = new Stack(); intStack.push(5); int indexOf = intStack.indexOf(5); assertEquals(0, indexOf); }

lastIndexOf에서도 ()는 항상 스택의 상단과 가장 가까운 요소의 인덱스를 찾을 수 있습니다 . 이것은 search () 와 매우 유사하게 작동 합니다. 중요한 차이점은 맨 위로부터의 거리 대신 인덱스를 반환한다는 점입니다.

@Test public void whenMultipleElementsAreOnStack_thenIndexOfReturnsLastElementIndex() { Stack intStack = new Stack(); intStack.push(5); intStack.push(5); intStack.push(5); int lastIndexOf = intStack.lastIndexOf(5); assertEquals(2, lastIndexOf); }

7. 스택에서 요소 제거

요소 제거 및 검색에 모두 사용되는 pop () 작업 외에도 Vector 클래스 에서 상속 된 여러 작업을 사용하여 요소를 제거 할 수도 있습니다 .

7.1. 지정된 요소 제거

removeElement () 메서드를 사용 하여 주어진 요소의 첫 번째 항목을 제거 할 수 있습니다 .

@Test public void whenRemoveElementIsInvoked_thenElementIsRemoved() { Stack intStack = new Stack(); intStack.push(5); intStack.push(5); intStack.removeElement(5); assertEquals(1, intStack.size()); }

removeElementAt () 을 사용하여 스택 의 지정된 인덱스 아래에있는 요소를 삭제할 수도 있습니다 .

 @Test public void whenRemoveElementAtIsInvoked_thenElementIsRemoved() { Stack intStack = new Stack(); intStack.push(5); intStack.push(7); intStack.removeElementAt(1); assertEquals(-1, intStack.search(7)); }

7.2. 여러 요소 제거

removeAll () API를 사용하여 스택 에서 여러 요소를 제거하는 방법을 간략히 살펴 보겠습니다.이 API는 Collection 을 인수로 사용하고 Stack 에서 일치하는 모든 요소를 ​​제거합니다 .

@Test public void givenElementsOnStack_whenRemoveAllIsInvoked_thenAllElementsFromCollectionAreRemoved() { Stack intStack = new Stack(); List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7); intStack.addAll(intList); intStack.add(500); intStack.removeAll(intList); assertEquals(1, intStack.size()); assertEquals(1, intStack.search(500)); }

clear () 또는 removeAllElements () 메서드를 사용하여 스택 에서 모든 요소제거 할 수도 있습니다 . 두 방법 모두 동일하게 작동합니다.

@Test public void whenRemoveAllElementsIsInvoked_thenAllElementsAreRemoved() { Stack intStack = new Stack(); intStack.push(5); intStack.push(7); intStack.removeAllElements(); assertTrue(intStack.isEmpty()); }

7.3. 필터를 사용하여 요소 제거

스택 에서 요소를 제거하기위한 조건을 사용할 수도 있습니다 . 필터 표현식을 인수로 사용하여 removeIf ()를 사용하여이를 수행하는 방법을 살펴 보겠습니다 .

@Test public void whenRemoveIfIsInvoked_thenAllElementsSatysfyingConditionAreRemoved() { Stack intStack = new Stack(); List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7); intStack.addAll(intList); intStack.removeIf(element -> element < 6); assertEquals(2, intStack.size()); }

8. 스택 반복

Stack allows us to use both an Iterator and a ListIterator. The main difference is that the first one allows us to traverse Stack in one direction and second allows us to do this in both directions:

@Test public void whenAnotherStackCreatedWhileTraversingStack_thenStacksAreEqual() { Stack intStack = new Stack(); List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7); intStack.addAll(intList); ListIterator it = intStack.listIterator(); Stack result = new Stack(); while(it.hasNext()) { result.push(it.next()); } assertThat(result, equalTo(intStack)); }

All Iterators returned by Stack are fail-fast.

9. Stream API for the Java Stack

Stack is a collection, which means we can use it with Java 8 Streams API. Using Stream with the Stack is similar to using it with any other Collection:

@Test public void whenStackIsFiltered_allElementsNotSatisfyingFilterConditionAreDiscarded() { Stack intStack = new Stack(); List inputIntList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 9, 10); intStack.addAll(inputIntList); List filtered = intStack .stream() .filter(element -> element <= 3) .collect(Collectors.toList()); assertEquals(3, filtered.size()); }

10. Summary

This tutorial is a quick and practical guide to understand this core class in Java – the Stack.

물론 Javadoc에서 전체 API를 탐색 할 수 있습니다.

그리고 항상 그렇듯이 모든 코드 샘플은 GitHub에서 찾을 수 있습니다.