两个栈实现队列
设有 s1,s2 两个栈,s1 用于入队操作,s2 用于出队操作。
入队:如果 s2 有元素,就将 s2 所有元素压入 s1,然后将新入队的元素压入 s1。
出队:如果 s1 有元素,就将 s1 所有元素压入 s2,然后 s2 移除栈顶元素。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>两个栈实现队列</title>
</head>
<body>
</body>
<script>
let s1 = [];//用于入队
let s2 = [];//用于出队
function inQ(val) {
while(s2.length > 0) {
let t = s2.pop();
s1.push(t);
}
s1.push(val);
console.log(val + "入队");
}
function out() {
while(s1.length > 0) {
let t = s1.pop();
s2.push(t);
}
console.log(s2.pop() + "出队");
}
inQ(1);
inQ(2);
inQ(3);
out();
inQ(4);
out();
out();
out();
inQ(5);
out();
</script>
</html>
效果:
O(n) 的时间复杂度和 O(1) 的空间复杂度。
这只是基础版本,可以优化
两个队列实现栈
设有 q1,q2 两个队列,变量 flag 表示元素当前在哪个队列,flag == 1 表示元素都在 q1,flag == 2 表示元素都在 q2。
入栈:将要入栈的元素压入 flag 对应的队列即可。
出栈:将包含元素的队列的元素都压入另一个队列,只留末尾的元素,然后将这个元素移除,并修改 flag 的值。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>两个队列实现栈</title>
<script>
let q1 = [];
let q2 = [];
let flag = 1;
function inS(val) {
if (flag == 1) {
q1.push(val);
} else if (flag == 2) {
q2.push(val);
}
console.log(val + "入栈");
}
function out() {
if (flag == 1) {
while (q1.length > 1) {
q2.push(q1.shift());
}
console.log(q1.shift() + "出栈");
flag = 2;
} else if (flag == 2) {
while (q2.length > 1) {
q1.push(q2.shift());
}
console.log(q2.shift() + "出栈");
flag = 1;
}
}
inS(1);
inS(2);
inS(3);
inS(4);
out();
out();
out();
inS(5);
out();
out();
</script>
</head>
<body>
</body>
</html>
效果:
O(n) 的时间复杂度和 O(1) 的空间复杂度。
基础版本,可以优化。