队列为FIFO原则。
以下代码在用两个队列实现栈时进栈时间复杂度为O(n),出栈时间复杂度为O(1),大家也可自行改成进栈O(1)出栈O(n)来练手。
import java.util.LinkedList;
import java.util.Queue;
public class MyQueueAndMystackByQueneTest {
public static void main(String[] args) {
MyQueue q = new MyQueue(2);
try {
q.enqueue(1);
q.dequeue();
} catch (Exception e) {
e.printStackTrace();
}
MyStackbyqueue s = new MyStackbyqueue();
s.push(1);
s.pop();
}
}
class MyQueue{
private double[] data;
private int tail,head,size;//size这里用来判断队列是否满了,与是否需要将head与tail置0
public MyQueue(int size) {
data = new double[size];
tail = 0;
head = 0;
this.size = size;
}
public void enqueue(double x)throws Exception {
if((tail + 1) % size == head)//这种控制方法会造成一个格子的浪费
throw new Exception("Overflow");
else {
data[tail] = x;
if(tail == size - 1)
tail = 0;
else tail++;
}
}
public double dequeue()throws Exception{
if(head == tail)
throw new Exception("Underflow");
else {
if(head == size - 1) {
head = 0;
return data[size-1];
}else return data[head++];
}
}
}
class MyStackbyqueue{
Queue<Double> inoutbox = new LinkedList<>();
Queue<Double> auxilaary = new LinkedList<>();
public MyStackbyqueue() {}
public void push(double x) {//进栈时间复杂度为O(n)
while(!inoutbox.isEmpty())
auxilaary.add(inoutbox.poll());
inoutbox.add(x);
while(!auxilaary.isEmpty())
inoutbox.add(auxilaary.poll());
}
public double pop() {
return inoutbox.poll();//出栈时间复杂度为O(1)
}
}