用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)
实现 MyStack 类:
void push(int x)
将元素 x 压入栈顶int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回 true ;否则,返回 false
思路:
代码题解:
class MyStack {
// 创建队列
Queue<Integer> q1;
Queue<Integer> q2;
// 初始化
public MyStack() {
q1 = new LinkedList();
q2 = new LinkedList();
}
//压栈
public void push(int x) {
if(!q1.isEmpty()){
q1.offer(x);//压栈
}else if(!q2.isEmpty()){
q2.offer(x);
}else{
q1.offer(x);
}
}
//出栈
public int pop() {
if(empty()){
return -1;
}
if(!q1.isEmpty()){
int n = q1.size();//获取 q1 队列的元素个数
for(int i = 0; i < n-1;i++){//循环 q1-1 次
q2.offer(q1.poll());//把 q1 弹出的元素压到 q2 中
}
return q1.poll();//返回 q1 中最后一个元素
}else{
int n = q2.size();
for(int i = 0; i < n-1;i++){
q1.offer(q2.poll());
}
return q2.poll();
}
}
// 获取栈顶元素
public int top() {
if(empty()){
return -1;
}
if(!q1.isEmpty()){
int n = q1.size();
int x = 0;//用来保留最后的元素
for(int i = 0; i < n;i++){
x = q1.poll();//弹出的元素赋值给x
q2.offer(x);
}
return x;//返回最后保留的元素
}else{
int n = q2.size();
int x = 0;
for(int i = 0; i < n;i++){
x = q2.poll();
q1.offer(x);
}
return x;
}
}
// 判断栈是否为空 当二个队列为空时返回 true
public boolean empty() {
return q1.isEmpty() && q2.isEmpty();
}
}
用栈实现队列
使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty)
实现 MyQueue 类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回 true ;否则,返回 false
思路:
- 需要创建二个栈来实现队列
入队列:直接放到 q1 栈中
出队列:直接弹出 q2 栈的栈顶元素,如果 q2 栈为空,就把 q1 栈所有元素压到 q2 栈中
获取队头元素:操作和以上相同,只需要最后返回的是栈顶元素,不需要弹出
class MyQueue {
// 创建栈
private Stack<Integer> q1;
private Stack<Integer> q2;
// 初始化
public MyQueue() {
q1 = new Stack<>();
q2 = new Stack<>();
}
//压栈
public void push(int x) {
q1.push(x);
}
//弹出
public int pop() {
// 判断栈是否为空
if(empty()){
return -1;
}
//如果 q2 为空
if(q2.empty()){
// 把 q1 所有元素压到 q2 中
while(!q1.empty()) {
q2.push(q1.pop());
}
}
return q2.pop(); // 弹出 q2 的栈顶元素
}
//获取队头元素
public int peek() {
if(empty()){
return -1;
}
if(q2.empty()){
while(!q1.empty()) {
q2.push(q1.pop());
}
}
return q2.peek();
}
// 判断栈是否为空 当二个栈为空时返回 true
public boolean empty() {
return q1.empty() && q2.empty();
}
}