JAVA——用栈实现队列
问题:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回队列开头的元素 boolean empty() 如果队列为空,返回 true ;否则,返回 false
方法: 1.创建两个栈 2.push(int x) 将元素 x 推到队列的末尾:将元素全都放到栈1中。 3.pop() 从队列的开头移除并返回元素:分为两种情况。第一种要考虑两个栈都为空的情况。第二种要考虑在栈2为空的情况下,若栈1不为空则把栈1中要删除的元素,push到栈2中,再pop删除并返回栈顶元素(队头元素)(如图第一行);栈2不为空的话就直接返回并删除栈顶元素(如图第二行,要先出了已经放入栈2中的元素,才能放入新的元素)。
4.peek() 返回队列开头的元素:不用删除,直接修改3中的pop为peek。 代码:
class MyQueue { private Stack<Integer> s1; private Stack<Integer> s2; public MyQueue() { s1=new Stack<>(); s2=new Stack<>(); } public void push(int x) { s1.push(x);//指定push到第一个栈中 } //删除队头元素 public int pop() { if(empty()){ return -1; } if(s2.empty()){ while(!s1.empty()){ s2.push(s1.pop()); } } return s2.pop(); } //获取队头元素 public int peek() { if(empty()){ return -1; } if(s2.empty()){ while(!s1.empty()) { s2.push(s1.pop()); } } return s2.peek(); } public boolean empty() { return s1.isEmpty()&&s2.isEmpty(); } }
下一篇:
介绍一下Mybatis的缓存机制