제목 설명
다음 스택을 사용하여 큐 구현 :
- 푸시 (X) - 스택 원소 X
- ) (팝업 - 상단 요소를 제거
- 상단 () - 상단의 요소를 가져옵니다
- ) (빈 - 반환 스택이 비어 있는지
참고 :
- / 다시 들여다이며, 푸시 앞, 크기에서 팝, 이러한 작업은 합법적으로 비어 - 당신은 기본 큐의 작업을 할 수 있습니다.
- 당신이 대기열을 지원하지 않을 수 있습니다 사용하는 언어입니다. 당신은 큐, 표준에 대한 작업만큼 큐를 시뮬레이션 할 목록이나 양단 큐 (양단 큐)를 사용할 수 있습니다.
- 당신은 모든 작업 (예를 들어, 빈 스택에 팝업 작동이나 상단 호출하지 않습니다) 유효하다고 가정 할 수있다.
문제 해결 아이디어
우리는 FIFO 큐의 특성 요소 것을 알고, 스택의 특성이 문제, 우리가 할 수의 첫 번째 아웃 요소의 마지막 스택 구현하기 위해 두 개의 큐를 사용하는 기능을 :
아래에 도시 된 바와 같이, 먼저, 스택 메모리 공간을 구현하기 위해 사용될 두 개의 큐를 정의하고, 상기 스택이 때문에 연속적으로 번호 하나로 큐 요소가 될 때, 상기 스택이 때문에 소자 큐 중 하나가 순차적으로 큐에 설정하는 것이 때 II 큐 출력 큐 하나의 마지막 요소는 큐의 최종 "푸시", 따라서 스택 동작을 완료의 최종 요소 때문에, 상기 소자는 큐에 저장되고,이 경우는 II 하나의 큐가 비어 숫자 뒤에 다시 튀어 필요할 때 큐 하나의 큐에 두 요소 큐 요소 최종적 때문에 무한히에서 스택 리턴;
우리의 방법은 얻어진 - 큐가 비어 있지 않을 때 큐가 빈 랜덤 요소가되는 경우, 큐에 가압 부재가 대기열에, 비어 있지 않은, 적층 체의 다른 모든 요소는 비어있는 큐에 순차적 때 마지막으로, 스택으로 만 창 요소, 판정 스택 방법 비어 있는지 그렇지 스택이 비어, 비어 있지 스택과 비어 큐가 있는지 여부를 판정한다
코드
import java.util.LinkedList;
import java.lang.Integer;
public class MyStack {
/** Initialize your data structure here. */
private LinkedList<Integer>[] queue=new LinkedList[2]; //用两个队列实现栈
private int queueIndex;
public MyStack() {
for(int i=0;i<2;i++)
{
queue[i]=new LinkedList<>();
}
queueIndex=0;
}
/** Push element x onto stack. */
public void push(int x) {
queue[queueIndex].offer(x);
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
int element;
while(queue[queueIndex].size()>1)
{
int e=queue[queueIndex].pop();
queue[(queueIndex+1)%2].offer(e);
}
element=queue[queueIndex].pop();
queueIndex=(queueIndex+1)%2;
return element;
}
/** Get the top element. */
public int top() {
int element;
while(queue[queueIndex].size()>1)
{
int e=queue[queueIndex].pop();
queue[(queueIndex+1)%2].offer(e);
}
element=queue[queueIndex].pop();
queue[(queueIndex+1)%2].offer(element);
queueIndex=(queueIndex+1)%2;
return element;
}
/** Returns whether the stack is empty. */
public boolean empty() {
if(queue[0].isEmpty() && queue[1].isEmpty())
{
return true;
}
else
{
return false;
}
}
}