leetcode总结(225 && 232 : 使用队列实现栈以及使用栈实现队列)
题目链接及描述
分别为leetcode 中的232 以及 225,数据结构类型题目,大致要求是分别用队列和栈实现栈和队列
链接: 232. implement queue using stacks. && 225. implement stack using queues.
225. implement stack using queues
思路
使用2个队列(q1, q2), 其中q1用于存储实际栈中的内容,由于栈和队列的不同特性(栈为先进后出FILO,队列为先进先出FIFO), 因此需要另外一个队列进行辅助。并且为了读取栈最顶端的数据方便,需要定义一个变量top,以实现栈的top() 操作。
代码
初始化
private Queue<Integer> q1;
private Queue<Integer> q2;
int top;
/** Initialize your data structure here. */
public MyStack() {
q1 = new LinkedList<>();
q2 = new LinkedList<>();
}
如图, 左边为将要实现的结果(MyStack), 右边为实际的结构,相当于左边为黑盒子,右边为黑盒子里的内容
插入操作
当我们要对插入一个元素时,只需将元素插入queue1中即可,并且每插入一个元素,就将top等于那个元素,即为栈顶
/** Push element x onto stack. */
public void push(int x) {
q1.offer(x);
top = x;
}
此处模拟插入4个元素(1 - 4)
弹出操作
要实现栈的 pop() 操作,此时就需要借助另外一个队列(queue2), 具体操作为:
- 队列1中的元素弹出,放入队列2中(并使用top进行标记),直到队列1剩下一个数,这个数即为栈顶值。
- 将栈顶值弹出并记录,同时top就指向了原栈顶后的值
- 将队列2的数弹出并放入队列1中,维持原有队列的顺序。此处,使用指针将地址进行交换,减少代码运行时间
- 将栈顶值返回,
/** Removes the element on top of the stack and returns that element. */
public int pop() {
while (q1.size() > 1) {
top = q1.poll();
q2.offer(top);
}
int result = q1.poll();
Queue<Integer> temp = q2;
q2 = q1;
q1 = temp;
return result;
}
将q1 中的元素弹出,每弹出一个,将其标记为top,同时放入q2 中
弹出栈顶元素后,queue1 和 queue2 交换位置(指向相互之间的地址)
top() 以及 empty()
由于代码在操作过程中不断维护top对栈