仅用栈实现队列结构
解题思想:
- 准备一个dataIn栈执行入队操作,一个dataOut栈执行出队操作;
- 入队操作时:将数据正常压入dataIn栈即可
- 出队操作时:将dataIn栈的数据倒入dataOut栈,然后将dataOut栈中的数据出栈即可
- 注意:dataIn操作向dataOut栈倒入数据需要遵循两个原则:
- dataIn必须一次性全部将栈中所有数据都给dataOut栈
- 执行倒入操作前必须保证dataOut栈中没有数据
let stcQueue = {
dataIn: [],
dataOut: [],
enqueue: function(a) {
this.dataIn.push(a);
},
dequeue: function() {
dao(this.dataIn, this.dataOut);
return this.dataOut.pop();
}
};
let dao = function(dataIn, dataOut) {
if (dataOut.length !== 0) {
return "error";
} else {
while (dataIn.length !== 0) {
dataOut.push(dataIn.pop());
}
}
};
仅用队列实现栈结构
解题思想:
- 准备两个队列data1,data2;spePush(入栈)操作时:哪个队列不为空就放入哪个队列
- spePop(出栈)操作时:若两个队列都为空,则报错;
- 若有队列不空,则将不空的队列除最后一个元素的其余元素都给空队列
- 然后返回该队列剩余的最后一个元素给用户
- 只能用pop(队列尾部加元素)和shift(队列头部出队)操作
let queStack = {
data1: [],
data2: [],
pushQ: function(a) {
if (this.data1.length === 0 && this.data2.length === 0) {
this.data1.push(a);
} else if (this.data1.length !== 0 && this.data2.length === 0) {
this.data1.push(a);
} else if (this.data1.length === 0 && this.data2.length !== 0) {
this.data2.push(a);
}
},
popQ: function() {
if (this.data1.length === 0 && this.data2.length === 0) {
return "error";
} else if (this.data1.length === 0) {
while (this.data2.length - 1 !== 0) {
this.data1.push(this.data2.shift());
}
return this.data2.shift();
} else {
while (this.data1.length - 1 !== 0) {
this.data2.push(this.data1.shift());
}
return this.data1.shift();
}
}
};
实现一个特殊的栈:
- 在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
- 要求:
- spePop()、spePush()、getMin()操作的时间复杂度都是O(1)
- 可以使用现成的栈
解题思想:
- 最容易想的思路是每次遍历栈中元素找出最小的元素,但题目要求时间复杂度为O(1);遍历的时间复杂度是O(n),故不可行
- 用两个栈,一个data栈做正常的spePop()、spePush()操作,另一个为min栈,用于存放data栈中的最小值
- 往min栈中放入元素的原则为:
- 当data栈spePush元素时,如果min为空则直接将相同的元素也spePush到min栈;
- 如果min不为空,则比较min栈顶和data要spePush的元素,谁小就spePush谁入min栈
- 当data栈spePop元素时,min栈也spePop;
- 调用getMin操作则返回min栈栈顶即可
let speStcak = {
data: [],
min: [],
spePush: function(a) {
this.data.push(a);
if (this.min.length === 0) {
this.min.push(a);
} else {
let m = a < this.min[this.min.length - 1] ? a : this.min[this.min.length - 1];
this.min.push(m);
}
},
spePop: function() {
if (this.data.length === 0 || this.min.length === 0) {
return "error";
} else {
this.min.pop();
return this.data.pop();
}
},
getMin: function() {
if (this.min.length === 0) {
return "error";
} else {
return this.min[this.min.length - 1];
}
}
};