栈是和列表类似的一种数据结构,可用来解决计算机世界里的很多问题。栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快,而且容易实现。
1 对栈的操作
栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称之为栈顶。
栈具有后入先出的特点。所以任何不在栈顶的元素都无法访问,为了得到栈底的元素,必须拿掉上面的元素。
栈的主要操作:
- 将一个元素压入栈,使用push()方法
- 将一个元素弹出栈,使用pop()方法,会删除栈顶元素
- 预览栈顶元素,peek()方法,不会删除
记录栈顶元素的位置,同事为了标记哪里可以加入元素,我们使用变量top。除push(),pop(),peek()外,栈还有其他方法及属性。clear()清除栈内所有元素,length记录栈内元素的个数,empty属性表示栈内是否含有元素。
2 栈的实现
这里采用数组作为存储数据的底层数据结构。
function Stack() {
this.dataStore = [];
this.top = 0;
this.push = push;
this.pop = pop;
this.peek = peek;
this.clear = clear;
this.length = length;
}
function push(element) {
this.dataStore[this.top++] = element;
}
function peek() {
return this.dataStore[this.top-1];
}
function pop() {
return this.dataStore[--this.top];
}
function clear() {
this.top = 0;
}
function length() {
return this.top;
}
3 使用stack类
3.1 数制间的相互转换
function mulBase(num, base) {
var s = new Stack();
do {
s.push(num % base);
num = Math.floor(num /= base);
} while (num > 0);
var converted = "";
while (s.length() > 0) {
converted += s.pop();
}
return converted;
}
3.2 回文
function isPalindrome(word) {
var s = new Stack();
for (var i = 0; i < word.length; ++i) {
s.push(word[i]);
}
var rword = "";
while (s.length() > 0) {
rword += s.pop();
}
if (word == rword) {
return true;
}
else {
return false;
}
}
3.3 递归演示
使用栈模拟递归过程
function fact(n) {
var s = new Stack()
while (n > 1) {
s.push(n--)
}
while(s.length > 0) {
product *= s.pop()
}
return product
}