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


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-S1 및 PUSH-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.