1.用队列实现栈
解题思想:
队列为一边进另一边出,而栈为一边进一边出,所以要实现栈必须要使队列中除队尾元素之外,进行循环尾插到队尾,来实现出栈
import java.util.LinkedList;
class MyStack {
private LinkedList<Integer> queue;//定义一个链表类的引用queue
public MyStack() {
queue = new LinkedList<>();
}
public void push(int x) {
queue.addLast(x);//队列的尾插入栈
}//栈的入栈
public int pop() {
int size = queue.size();
for (int i = 0; i < size - 1; i++) {
int v = queue.pollFirst();
queue.addLast(v);//将队列的队首元素尾插入队尾实现栈的出栈
}
return queue.pollFirst();
}//栈的出栈
public int top() {
int size = queue.size();
for (int i = 0; i < size - 1; i++) {
int v = queue.pollFirst();
queue.addLast(v);//将队列的队首元素提出来,进行尾插
}
int v = queue.pollFirst();
queue.addLast(v);
return v;//将原队尾元素出栈
}//返回栈顶元素
public boolean empty() {
return queue.isEmpty();
}//栈的判空
}
2.用栈实现队列
思路:
使用两个栈用来实现队列
队列的入队:与栈的入栈是一致的
队列的出队:需要两个栈in和out,将所有元素先存在in栈中,判断out栈是否为空,为空直接将元素依尾插到out栈
获取队列的队首元素:进行出队的操作将所有元素放入out栈中,将out栈内栈顶元素出栈
队列的判空:需要in栈和out栈均为空
import java.util.ArrayList;
class MyQueue {
private ArrayList<Integer>in;
private ArrayList<Integer>out;//设置了两个ArrayList型变量in和out
/** Initialize your data structure here. */
public MyQueue() {
in=new ArrayList<>();
out=new ArrayList<>();
}
/** Push element x to the back of queue. */
public void push(int x) {
in.add(x);//栈的尾插方法
}//实现队列的入队
/** Removes the element from in front of queue and returns that element. */
public int pop() {
if(out.isEmpty()){
int size=in.size();
for(int i=0;i<size;i++){
int v=in.remove(in.size()-1);
out.add(v);//将in栈中的元素全部压入栈out
}
}
return out.remove(out.size()-1);//remove方法删除指定元素
}//实现队列的出队
/** Get the front element. */
public int peek() {
if(out.isEmpty()){
int size=in.size();
for(int i=0;i<size;i++){
int v=in.remove(in.size()-1);
out.add(v);
}
}//将in栈中的元素全部压入栈out
return out.get(out.size()-1); //使用顺序表的get方法获取栈首元素
}//获取队首元素
/** Returns whether the queue is empty. */
public boolean empty() {
return in.isEmpty()&&out.isEmpty();
}//队列判空
}