1.用栈实现队列
模拟队列的入队操作:都是放到第一个栈
模拟出队的操作:
1.判断第二个栈是否为空?如果为空,需要把第一个栈中的所有元素都放到第二个栈里,取出第二个栈中的栈顶元素
2.如果不为空,直接取出第二个栈当中的栈顶元素
class MyQueue {
LinkedList<Integer>s1;
LinkedList<Integer>s2;
public MyQueue() {
s1=new LinkedList<>();
s2=new LinkedList<>();
}
public void push(int x) {
s1.offer(x);
}
public int pop() {
if(empty()){
return -1;
}
if(s2.isEmpty()){
while(!s1.isEmpty()){
s2.offer(s1.poll());
}
}
return s2.poll();
}
public int peek() {
if(empty()){
return -1;
}
if(s2.isEmpty()){
while(!s1.isEmpty()){
s2.offer(s1.poll());
}
}
return s2.peek();
}
public boolean empty() {
return s1.isEmpty()&&s2.isEmpty();
}
}
2. 用队列实现栈
1.模拟的入栈操作是:放到了不为空的队列当中
2.模拟出栈操作是:把不为空的队列中的size-1元素放到另一个队列当中,最后剩下的这一个就是我们模拟“出栈”的元素
class MyStack {
LinkedList<Integer> q1;
LinkedList<Integer> q2;
public MyStack() {
q1=new LinkedList<>();
q2=new LinkedList<>();
}
public void push(int x) {
if(!q1.isEmpty()){
q1.offer(x);
}else if(!q2.isEmpty()){
q2.offer(x);
}else{
q1.offer(x);
}
}
public int pop() {
if(empty()){
return -1;
}
if(!q1.isEmpty()){
int size=q1.size();
for(int i=0;i<size-1;i++){
q2.offer(q1.poll());
}
return q1.poll();
}else{
int size=q2.size();
for(int i=0;i<size-1;i++){
q1.offer(q2.poll());
}
return q2.poll();
}
}
public int top() {
if(empty()){
return -1;
}
if(!q1.isEmpty()){
int size=q1.size();
int val=0;
for(int i=0;i<size;i++){
val=q1.poll();
q2.offer(val);
}
return val;
}else{
int size=q2.size();
int val=0;
for(int i=0;i<size;i++){
val=q2.poll();
q1.offer(val);
}
return val;
}
}
public boolean empty() {
return q1.isEmpty()&&q2.isEmpty();
}
}