代码随想录算法训练营第十天|232.用栈实现队列、225.用队列实现栈
232.用栈实现队列
问题简述:用栈实现队列的初始化、push、pop、peek、empty。
思考:当时学数据结构时候学过。
算法思路:定义两个栈,分别为入栈和出栈。push时,直接将元素push到进入栈;pop时,如果出栈里面没有元素,则将入栈的所有元素推入出栈,此时栈顶则为最早进入的元素,可以pop元素,如果出栈中有元素,出栈栈顶的元素即为最先入栈的元素,直接pop元素;peek同理;empty即判断两个栈是否都为空。
import java.util.Stack;
class MyQueue {
//定义两个栈分别为入栈和出栈
Stack<Integer> stackin;
Stack<Integer> stackout;
//初始化
public MyQueue() {
stackin = new Stack<>();
stackout = new Stack<>();
}
//将元素放入入栈
public void push(int x) {
stackin.push(x);
}
//如果出栈里面没有元素,则将入栈的所有元素推入出栈
public int pop() {
if (stackout.empty()){
while (!stackin.empty()){
stackout.push(stackin.pop());
}
}
//元素从出栈推出
return stackout.pop();
}
//和pop操作一样,只是没有再进行一次pop
public int peek() {
if (stackout.empty()){
while (!stackin.empty()){
stackout.push(stackin.pop());
}
}
return stackout.peek();
}
//判断是否两个栈都为空
public boolean empty() {
if (stackout.empty() && stackin.empty()) return true;
return false;
}
}
225.用队列实现栈
问题简述:用队列实现栈的初始化、push、pop、peek、empty。
思考:感觉要比用栈实现队列更容易一些。
算法思路:用一个队列模拟栈,每次出栈时,将之前入队的n-1个元素出队并再次入队,这样队头则是最后入队的元素。
import java.util.LinkedList;
import java.util.Queue;
class MyStack {
//用一个队列
Queue<Integer> queen;
public MyStack() {
queen = new LinkedList<>();
}
public void push(int x) {
queen.offer(x);
}
public int pop() {
//将之前入队的n-1个元素出队并再次入队
for (int i = 0; i < queen.size() - 1; i++) {
queen.offer(queen.poll());
}
return queen.poll();
}
public int top() {
//将之前入队的n-1个元素出队并再次入队
for (int i = 0; i < queen.size() - 1; i++) {
queen.offer(queen.poll());
}
int a = queen.peek();
//记得将这个元素再次插入队尾
queen.offer(queen.poll());
return a;
}
public boolean empty() {
return queen.isEmpty();
}
}
感想
这两天进度慢了些,要继续坚持啊!