인터뷰 중에, 스택과 줄은 종종 쌍으로 나타나서 검사합니다. 이 기사에는 스택 및 대기열에 대한 다음 테스트 내용이 포함되어 있습니다.
(1) 스택 생성
(2) 대기열 생성
(3) 두 개의 스택은 큐를 구현합니다
(4) 두 개의 대기열이 스택을 구현합니다
(5) 최소 함수 min ()로 스택을 설계하고 최소, 푸시, 팝 및 모두의 시간 복잡성이 O (1)입니다.
(6) 스택의 푸시 및 팝 시퀀스가 일관된 지 확인
1. 스택 생성 :
다음으로, 확장을 용이하게하기 위해 링크 된 목록의 형태로 스택을 만듭니다.
코드 구현 :
공개 클래스 {public node head; Node = New Node (data); } public node pop (current == null) {return node = current 스택에 노드를 넣고, 현재 백 반환 노드;} int node pre; }} public static void main (String [] args) {stack.push.push (2); pop (). data);스택에 들어가면 14 또는 15 줄의 코드가 중요합니다.
실행 효과 :
2. 대기열 생성 :
큐 생성에는 두 가지 형태의 큐 생성이 있습니다 : 배열 구조 구현 (순차적 대기열)과 링크 된 목록 구조 구현 (체인 큐)을 기반으로합니다.
다음으로, 링크 된 목록 형식으로 큐를 만들어 늘릴 때 대기열이 더 편리 해집니다. 대기열이 탈취되면 노드 헤드의 시작부터 시작하십시오.
코드 구현 :
스택에 들어가면 일반적인 링크 목록에 노드를 추가하는 것과 동일합니다.
공개 클래스 큐 {공개 노드 헤드; // 메소드 : 링크 된 목록에 노드 추가 (int data) {head == null = new Node (data); } else {current.next = new Node (data)}}}}; "큐는 비어 있습니다");} 노드 노드는 헤드를 삭제하려는 노드입니다. Node Next; public node (int data) {this.data = data; i = 0; i ++; .out.println (queue.pop ());}}실행 효과 :
3. 두 스택은 큐를 구현합니다.
아이디어 :
스택 1은 요소를 저장하는 데 사용되며 스택 2는 요소를 팝하는 데 사용되며 음수는 양수입니다.
간단히 말해서, 이제 데이터 1, 2 및 3을 스택 1에 넣은 다음 스택 1 (3, 2, 1)에서 나와서 스택 2에 넣은 다음 스택 2 (1, 2.3)에서 데이터를 제거하십시오. 그것은 대기열의 규칙을 준수합니다. 즉, 부정적이고 부정적인 것은 긍정적입니다.
코드 구현의 정식 버전 :
import java.util.stack;/*** 2015/9/9.*/public class queue {private stack <integer> stack1 = new stack <> (); // stack pr enqueue 작동 ivate stack <integer> stack2 = new stack <> (); // dequeue 작동을 실행하기위한 스택 // 메소드 : 대기열 공개 void push (int data) {stack1.push (data);}//method : 대기열에 큐를 제공 공개 int pop ()는 예외를 던지기 예외 {if (stack2.empty ()) {// stack1의 데이터를 stack2에 넣기 전에 stack2가 비어 있는지 확인해야합니다 (또는 처음에 비어 있습니다. STACK2의 데이터가 릴리스되었습니다), 그렇지 않으면 탈케 잉 순서가 엉망이 될 것입니다. stack1에서 stack2 [core code]}}에 넣습니다. if (stack2.empty ()) {// stack2가 비어 있으면 두 가지 가능성이 있습니다. 1. 처음에는 2 개의 스택이 비어 있습니다. STACK2의 데이터는 새로운 예외입니다 (Queu는 비어 있습니다. 푸시 (1); queue.push (2); System.out.println (queue.pop ()); queue.push (4); system.out .println (queue.pop () system.out.println (queue.pop ());22 행 및 30 행의 코드 순서와 의견에주의를 기울이면 그 의미를 신중하게 이해해야합니다.
실행 효과 :
4. 두 대기열은 스택을 구현합니다.
아이디어 :
1, 2 및 3을 대기열 1에 넣은 다음 큐 1에 상단 3을두고 하단 2와 3을 대기열 2에 넣고 큐 1에서 3을 넣습니다.이 시간에 큐는 비어 있습니다. 큐 2는 큐 1에 큐를 유지합니다. . . 차례로 순환하십시오.
코드 구현 :
import java.util.arraydeque; import java.util.queue;/*** 2015/9/9에서 smyhvae에 의해 만들어졌습니다 <integer> queue2 = new Arraydeque <integer> (); // 메소드 : stack public void push (int data) {queue1.add (data) // 메소드; int data; if (queue1.size () == 0) { "스택은 비어 있습니다") while (queue1.size ()! = 0). {date = queue1.poll (queue2. queue1.poll ());} 새 예외를 던지십시오 ( "스택은 비어 있습니다"); //이 줄의 코드가 무엇을 의미하는지} 공개 정적 무효 메인 (String [] args)은 예외 {stack st ack입니다. = 새 스택 (); stack.push.push (3); ));실행 효과 :
5. 최소 함수 min ()으로 스택을 설계하고 최소, 푸시, 팝 및 모두의 시간 복잡성이 O (1)이어야합니다. 최소 방법의 목적은 스택의 최소값을 반환 할 수 있습니다. 【wechat 인터뷰 질문】
일반적인 아이디어 :
일반적으로 말하면, 우리는 이러한 방식으로 생각할 수 있습니다. 최소 변수를 사용하여 요소를 추가 할 때마다 최소 요소와 비교하여 최소에 저장된 최소값을 보장 할 수 있습니다. 그러나이 경우 문제가있을 것입니다. 가장 작은 요소가 스택에서 벗어난 경우 나머지 요소 중 어느 것이 가장 작은 요소인지 어떻게 알 수 있습니까?
개선을위한 아이디어 :
여기에서 시간 동안 공간을 교환하기 위해 보조 스택을 추가해야합니다. 보조 스택에서 스택의 상단은 항상 현재 스택에서 가장 작은 값을 절약합니다. 구체적으로 : 원래 스택에 새 요소가 추가 될 때마다 새 요소가 작 으면 새 요소의 값을 보조 스택에 넣습니다 요소는 크고 보조 스택의 상단 요소를 보조 스택의 상단에 복사하십시오.
완전한 코드 구현 :
import java.util.stack;/*** 2015/9/9에서 smyhvae에 의해 생성되었습니다.*/public class minstack {private stack <integer> stack = new Stack <integer> (); 새 스택 <integer> (); // 보조 스택 : 스택의 상단은 항상 스택 공개 void 푸시 (int data)에서 가장 작은 요소를 저장합니다. /보조 if (minstack.size () == 0 || data <minstack.push (data) {minstack.add (minstack.peek ()); Code] Peek 메소드는 스택의 상단에서 요소를 반환합니다.}} public int pop ()는 예외 {if (stack.size () == 0) {throw new Exception ( "stack in the stack"); data = stack.pop (); Hollow ");} return minstack.peek ();} public static void main (string [] args)은 예외를 던져 {minstack stack = new minstack (); stack.push (4); stack.pus h (3); 스택 .push (5); system.out.println (stack.min ())};실행 효과 :
6. 스택의 푸시 및 팝 시퀀스가 일관된 지 여부를 결정하십시오.
간단히 말해서 : 데이터 세트 1, 2, 3, 4 및 5 세트가 스택에 순서대로 놓인 것으로 알려져 있으므로 주어진 스택이 올바른지 판단하십시오 ?
예를 들어:
데이터:
1, 2, 3, 4, 5
출력 1 :
5, 4, 3, 2, 1 (올바른)
출력 2 :
4, 5, 3, 2, 1 (올바른)
출력 3 :
4, 3, 5, 1, 2 (오류)
정식 버전 코드 :
java.util.stack;/*** 2015/9/9에 smyhvae가 생성했습니다.
*/
공개 클래스 스택 테스트 {
// 메소드 : 데이터 순서 1 배열은 스태킹 순서를 나타냅니다. 이제 Data2의 스태킹 순서가 올바른지 판단하십시오.
public static boolean sequenceispop (int [] data1, int [] data2) {
스택 <integer> stack = 새 스택 <integer> ();
for (int i = 0, j = 0; i <data1.length; i ++) {
stack.push (data1 [i]);
while (stack.size ()> 0 && stack.peek () == data2 [j]) {
stack.pop ();
J ++;
}
}
return stack.size () == 0;
}
public static void main (String [] args) {
스택 <integer> stack = 새 스택 <integer> ();
int [] data1 = {1, 2, 3, 4, 5};
int [] data2 = {4, 5, 3, 2, 1};
int [] data3 = {4, 5, 2, 3, 1};
System.out.println (sequenseispop (data1, data2));
System.out.println (sequenseispop (data1, data3));
}
}
코드는 비교적 간결하지만 이해하기가 어렵 기 때문에 신중하게 이해해야합니다.
실행 효과 :
위의 것은 Java 스택과 대기열에 대한 고전적인 인터뷰 질문입니다.