한 배열에 두 개의 스택을 구현하는 방법은 무엇입니까?


15

나는 이것이 숙제 문제가 아니라고 말하면서 시작하고 싶습니다. 더 나은 프로그래머가 될 유명한 CLRS 텍스트 인 알고리즘 소개를 읽고 있습니다. 나는이 책에 주어진 문제와 연습 문제를 스스로 해결하려고 노력하고있다.

내가 해결하기 위해 노력하고 훈련은 10.1-2을 에서 제 10 장 기본 데이터 구조 CLRS 두 번째 판에서. 그 상태는 다음과 같습니다.

두 스택 의 총 요소 수가 n 이 아니면 스택이 오버플로되지 않도록 한 배열 A [1..n] 에 두 스택을 구현하는 방법을 설명 하십시오 . PUSH 및 POP 작업은 O (1) 시간 내에 실행되어야합니다 .

지금까지 내가 찾은 해결책은 다음과 같습니다.

배열 A [1..n]이 S1 [1..i]S2 [i..n]의 두 스택을 구현 하도록 합니다.

들어 PUSH-S1PUSH-S2 스택 '전체'이면 동작 다음에 요소를 밀어 시작 다른 (스택 예. 스택 경우 S1이 새로운 요소는 다음에 그 소자를 눌러 밀어 되려고 할 때 가득 스택 S2 및 그 반대).

이 방법의 문제점은 어떤 요소가 어떤 스택에 속하는지 '기억'할 방법이 없기 때문에 POP-S1 또는 POP-S2를 안정적으로 사용할 수 없다는 것입니다. 스택의 요소가 (키, 값) 쌍이고 키가 스택 번호 인 경우 최악의 경우 i 또는 (ni) 번 검색해야 할 요소를 팝하려면 O (n ) (하지 않을 것이다, 내가 잘못 여기에 나는 경우) 정정 해줘 주시기 O (1) .

나는 꽤 오랫동안 질문에 내 머리를 두드리고있다. 내가 올바른 길을 가고 있습니까? 누군가이 문제를 해결하기 위해 가능한 포인터를 줄 수 있습니까?

일반적으로 이러한 문제에 대해 어떻게 생각해야합니까? 아니면 정말 똑똑한 사람들 만 이러한 유형의 문제를 해결할 수 있습니까? 이와 같은 문제를 해결 / 해결하는 것 (즉, 경험을 얻는 것)이 이것에 대해 더 나아지게하는 데 도움이됩니까?

깨달음을 기다립니다.


3
"이와 같은 문제를 해결 / 해결하는 데 도움이 되나요 (예 : 경험을 쌓는 것이) 나아질 수 있습니까?" 내 경험상, 이것은 분명히 사실입니다. 다른 것이 없다면 문제에 대해 여러 가지 방법으로 생각했을 것이며 그 자체만으로도 더 많은 통찰력을 개발할 수 있습니다. 내가 최근에 들었 듯이 좋은 아이디어를 얻는 가장 좋은 방법은 많은 아이디어를 갖는 것입니다.
G. 바흐

답변:


7

무엇 Yuval 교수 외에 또 다른 힌트는 말했다 : 그것은 배열의 특정 방식으로 스택을 배치하는 데 도움이 따라서 성장 자신의 방향을 수정. 그들은 같은 방향으로 자랄 필요가 없습니다.


5

힌트는 다음과 같습니다.

  1. 스택 중 하나는 "위로", 다른 하나는 "아래로"커져야합니다.
  2. 어떤 요소가 어떤 스택에 속하는지 '기억'하는 방법은 없습니다. 추가 변수를 사용하여 이와 같은 것을 도울 수 있습니다. (이는 첫 번째 힌트에서 제안한 솔루션에 더 적합합니다.)

1

첫 번째 스택은 1에서 시작하여 n쪽으로 커지는 반면, 두 번째 스택은 n에서 시작하여 1쪽으로 커집니다. 두 스택 스택이 인접 해있을 때 요소를 누르면 스택 오버플로가 발생합니다.


1

이 방법은 사용 가능한 공간을 효율적으로 활용합니다. arr []에 사용 가능한 공간이 있으면 오버플로가 발생하지 않습니다. 아이디어는 arr []의 두 극단적 인 모서리에서 두 개의 스택을 시작하는 것입니다. stack1은 맨 왼쪽 요소에서 시작하고 stack1의 첫 번째 요소는 인덱스 0에서 푸시됩니다. stack2는 맨 오른쪽 모서리에서 시작하고 stack2의 첫 번째 요소는 인덱스 (n-1)에서 푸시됩니다. 두 스택 모두 반대 방향으로 커지거나 줄어 듭니다. 오버플로를 확인하려면 두 스택의 최상위 요소 사이에 공간이 있는지 확인해야합니다.


-1

다른 해결책을 생각했습니다. 배열을 반으로 나누면 (또는 배열의 길이가 홀수 인 경우 가능한 한 가깝게) 첫 번째 요소가 첫 번째 스택으로 이동하고 두 번째 요소가 두 번째 스택으로 이동합니다. 터지는 동안 우리는이 단계들을 되돌릴 수 있습니다. 그러나 이런 식으로 구현하면 스택 원칙을 위반합니까?


/2

-2

힌트

배열 만들기

인덱스가 홀수 인 배열 요소는 stack1 용입니다.

인덱스가 짝수 인 배열 요소는 stack2 용입니다.

이제 두 스택을 왼쪽에서 오른쪽으로자를 수 있습니다

두 스택의 최상위 위치를 유지하는 변수를 유지하십시오. 배열을 검색하지 않아도됩니다.

stack2가 비어있는 동안 stack1이 가득 차면 일부 변수를 유지하여 stack2의 추가 stack1 요소를 추적 할 수 있습니다


이것은 매우 복잡합니다. 기존 답변은 이미 문제를 해결하는 훨씬 간단한 방법을 제공합니다
David Richerby
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.