0%

剑指offer09(简单):用两个栈实现队列

题目

剑指offer09:用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例1:

1
2
3
4
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]

示例2:

1
2
3
4
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

代码

方案1:暴力破解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class CQueue {
//声明两个栈
private Stack<Integer> stack1;
private Stack<Integer> stack2;

public CQueue() {
//实例化栈
stack1 = new Stack<>(); //用于入队
stack2 = new Stack<>(); //用于出队

}

//入队
public void appendTail(int value) {
while(!stack2.isEmpty()) {//当栈2不空时,元素搬回栈1,直到搬完
stack1.push(stack2.pop());
}

stack1.push(value); //栈2为空,元素入队

}

//出队
public int deleteHead() {
while(!stack1.isEmpty()) {//当栈1不空,元素搬入栈2,直到搬完
stack2.push(stack1.pop());
}

if(stack2.isEmpty()) {//无元素可出队
return -1;
}

return stack2.pop(); //有元素可出队

}
}

方案2:算法优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class CQueue {
//声明两个栈
private Stack<Integer> stack1;
private Stack<Integer> stack2;

public CQueue() {
//实例化栈
stack1 = new Stack<>(); //用于入队
stack2 = new Stack<>(); //用于出队

}

//入队
public void appendTail(int value) {

stack1.push(value); //元素直接入队即可

}

//出队
public int deleteHead() {
if(stack2.isEmpty()) {//栈2为空,从栈1中搬入元素,直到搬完
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}

if(stack2.isEmpty()) {//栈1中元素搬完之后,栈2还为空,则无元素可出队
return -1;
}else {//栈1中元素办完之后,栈2不空了,则元素直接出队
return stack2.pop();
}
}
}

随笔

java中创建栈

1
Stack<Integer> stack = new Stack<>();

两个算法的时间复杂度

方案1:

入队时间复杂度为O(n)

出队时间复杂度为O(n)

方案2:

入队时间复杂度为O(1)

出队时间复杂度为O(n)

-------------本文结束 感谢您的阅读-------------
觉得文章写的不错的话,请我喝瓶怡宝儿吧~ 🤞