Java 用栈实现队列和用对列实现栈
前言
Leetcode 第225题用队列实现栈
Leetcode 第232题用栈实现队列
一、使用队列实现栈实现以下操作
push(int x) 将元素 x 压入栈顶。
pop() 移除并返回栈顶元素。
top() 返回栈顶元素。
empty() 如果栈是空的,返回 true ;否则,返回 false 。
二、使用栈实现队列实现以下操作
push(int x) 将元素 x 推到队列的末尾
pop() 从队列的开头移除并返回元素
peek() 返回队列开头的元素
empty() 如果队列为空,返回 true ;否则,返回 false
1.队列实现栈
代码如下(示例):
class MyStack {
Queue<Integer> q1;
Queue<Integer> q2;
/** Initialize your data structure here. */
public MyStack() {
q1=new LinkedList<>();
q2=new LinkedList<>();
}
/** Push element x onto stack. */
public void push(int x) {
if(!q1.isEmpty()){
q1.offer(x);
}else if(!q2.isEmpty()){
q2.offer(x);
}else{
q1.offer(x);
}
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
if(empty()){
return -1;
}if(!q1.isEmpty()){
int len=q1.size();
int ret=-1;
for(int i=0;i<len-1;i++){
ret=q1.poll();
q2.offer(ret);
}return q1.poll();
}
else{
int len=q2.size();
int ret=-1;
for(int i=0;i<len-1;i++){
ret=q2.poll();
q1.offer(ret);
}return q2.poll();
}
}
/** Get the top element. */
public int top() {
if(empty()){
return -1;
}if(!q1.isEmpty()){
int len=q1.size();
int ret=-1;
for(int i=0;i<len;i++){
ret=q1.poll();
q2.offer(ret);
} return ret;
}
else{
int len=q2.size();
int ret=-1;
for(int i=0;i<len;i++){
ret=q2.poll();
q1.offer(ret);
}return ret;
}
}
/** Returns whether the stack is empty. */
public boolean empty() {
return q1.isEmpty()&&q2.isEmpty();
}
}
2.栈实现队列
代码如下(示例):
class MyQueue {
public Stack<Integer> s1;
public Stack<Integer> s2;
/** Initialize your data structure here. */
public MyQueue() {
s1=new Stack<>();
s2=new Stack<>();
}
/** Push element x to the back of queue. */
public void push(int x) {
s1.push(x);
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
if(empty()){
return -1;
}
if(s2.empty()){
while(!s1.empty()){
s2.push(s1.pop());
}}
return s2.pop();
}
/** Get the front element. */
public int peek() {
if(empty()){
return -1;
}
if(s2.empty()){
while(!s1.empty()){
s2.push(s1.pop());
}
}
return s2.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
return s1.empty()&&s2.empty();
}
}