用队列实现栈(Java)
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。 int pop() 移除并返回栈顶元素。 int top() 返回栈顶元素。 boolean empty() 如果栈是空的,返回 true ;否则,返回 false .
采用双队列实现一个后入先出的栈结构
Queue<Integer> queue1;
Queue<Integer> queue2;
public MyStack() { // 类名
// 双队列
queue1 = new LinkedList<Integer>();
queue2 = new LinkedList<Integer>();
}
一个栈的基本操作有出栈跟入栈以及查看是否为空三种操作,出栈还分为删除栈顶元素的出栈跟查看栈顶元素。因此可以分为push(int x)、pop()、top()、empty()四种操作函数
- 在入栈的操作中,先进入队列2中,再将队列1中的数据循环存入到队列2中,最后将队列1和队列2的中数据进行对调即可完成入栈
public void push(int x){
queue2.offer(x); // 将新数据存入队列2中
while(!queue1.isEmpty()){ // 判断队列中1是否为空,不为空则将数据存入队列2中
queue2.offer(queue1.poll()); // 取出队列1中的元素存入队列2中
}
// 置换队列数据
Queue<Integer> temp = queue1; // temp缓存
queue1 = queue2;
queue2 = temp;
}
-
在出栈操作中,分为两种,一种出栈即删除,另一种出栈不删除元素
// 第一种,删除元素 public int pop(){ return queue1.poll(); // 调用Queue结构函数即可 } // 第二种 不删除元素 public int top(){ return queue1.element(); // 同样调用函数即可 } -
最后一种 判断栈是否为空,也是调用函数即可
public boolean empty(){ if(queue1.isEmpty()){ // 判断队列1是否为空,因为队列1是主队列,只需判断队列1即可 return true; } return false; }
至此,栈的问题就可以解决了,该类问题可能不怎么常见,因为一般编程语言都会自带队列和栈的数据结构,无需我们再去实现栈变队列会这是队列变栈的问题。但这类问题可以让我们去思考如何通过其他数据结构去实现某一种结构的方法,也算是锻炼了我们对数据结构的熟练程度吧
*** 来源:力扣(LeetCode) 链接:leetcode.cn/problems/im… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。***