学习目标:
第五章 栈与队列
-
232.用栈实现队列
-
225. 用队列实现栈
学习内容:
232.用栈实现队列
思路: 将元素放到队列的末尾,也就是将元素直接存入stackIn即可,因为stackOut与stackIn出栈的顺序相反,因此最后放入stackIn的元素在stackOut中是最后出栈的,相当于是队列的末尾
public day_10() {
stackIn = new Stack<>(); // 负责进栈
stackOut = new Stack<>(); // 负责出栈
}
//将元素放到队列的末尾,也就是将元素直接存入stackIn即可,因为stackOut与stackIn出栈的顺序相反,因此最后放入stackIn的元素在stackOut中是最后出栈的,相当于是队列的末尾
public void push(int x) {
stackIn.push(x);
}
//从队列开头取出元素并且返回数值,将stackIn的元素全部存入stackOut后进行操作,并且受栈的先进后出影响,stackIn和stackOut元素顺序相反
public int pop() {
dumpstackIn();
return stackOut.pop();
}
//查出第一个元素的数值但不弹出
public int peek() {
dumpstackIn();
return stackOut.peek();
}
//判断队列是否为空
public boolean empty() {
return stackIn.isEmpty() && stackOut.isEmpty();
}
// 如果stackOut为空,那么将stackIn中的元素全部放到stackOut中
private void dumpstackIn(){
if (!stackOut.isEmpty()) return;//如果stackOut中不是空那么就无法添加其他元素,否则会改变元素顺序
while (!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
225. 用队列实现栈
思路: 向队列中直接插入元素相当于在栈中直接插入元素,只是修改取值的方式将队列取值方式变成跟栈相同。移除并返回栈顶元素,先获取队列的长度,然后减一,然后将最后一个元素前的全部元素弹出再重新写回队列,最后再弹出原来队列的最后一个元素也就是栈顶元素,最后返回值,因为其他元素全部重新添加了,因此原来的那个最后一个元素就变成了队列的第一个元素
Queue<Integer> queue;
public day_10() {
queue = new LinkedList<>();
}
//向队列中直接插入元素相当于在栈中直接插入元素,只是修改取值的方式将队列取值方式变成跟栈相同
public void push(int x) {
queue.add(x);
}
//移除并返回栈顶元素,先获取队列的长度,然后减一,然后将最后一个元素前的全部元素弹出再重新写回队列,最后再弹出原来队列的最后一个元素也就是栈顶元素,最后返回值,因为其他元素全部重新添加了,因此原来的那个最后一个元素就变成了队列的第一个元素
public int pop() {
rePosition();
return queue.poll();//弹出栈顶元素并且返回值
}
public int top() {
rePosition();
int result = queue.poll();//弹出元素并且返回值
queue.add(result);//然后重新插入回去,因为只需要查到值并不需要移除
return result;//返回值
}
public boolean empty() {
return queue.isEmpty();
}
public void rePosition(){
int size = queue.size();
size--;
while(size-->0)
queue.add(queue.poll());
}
学习时间:
下午三小时。