栈
栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快,而且容易实现。
1.对栈的操作
栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶。
- 后入先出(LIFO,last-in-first-out)的数据结构。
- 对栈的两种主要操作是将一个元素压入栈和将一个元素弹出栈。
- 入栈使用 push() 方法。
- 出栈使用 pop() 方法。pop() 方法虽然可以访问栈顶的元素。
- peek() 方法则只返回栈顶元素,而不删除它。
2.栈的实现
实现一个栈,当务之急是决定存储数据的底层数据结构。这里采用的是数组。 我们的实现以定义 Stack 类的构造函数开始:
function Stack() {
this.dataStore = [];
this.top = 0;
this.push = push;
this.pop = pop;
this.peek = peek;
}
我们用数组 dataStore 保存栈内元素,构造函数将其初始化为一个空数组。变量 top
记录栈顶位置,被构造函数初始化为0,表示栈顶对应数组的起始位置0。如果有元素被压入栈,该变量的值将随之变化。
2.1 push()的实现
当向栈中压入一个新元素时,需要将其保存在数组中变量 top 所对 应的位置,然后将top
值加 1,让其指向数组中下一个空位置。代码如下所示:
function push(element) {
this.dataStore[this.top++] = element;
}
2.2 pop()的实现
pop()
方法恰好与 push()
方法相反——它返回栈顶元素,同时将变量 top 的值减 1:
function pop() {
return this.dataStore[--this.top];
}
2.3 peek()方法的实现
方法返回数组的第 top-1 个位置的元素,即栈顶元素:
function peek() {
return this.dataStore[this.top-1];
}
如果对一个空栈调用 peek() 方法,结果为 undefined
。这是因为栈是空的,栈顶没有任何元素。
2.4 length()方法的实现
有时候需要知道栈内存储了多少个元素。length() 方法通过返回变量 top 值的方式返回栈 内的元素个数: function length() { return this.top; } 最后,可以将变量 top 的值设为 0,轻松清空一个栈: function clear() { this.top = 0; }
3.实战
3.1回文
回文是指这样一种现象:一个单词、短语或数字,从前往后写和从后往前写都是一样的。 比如,单词“dad”、“racecar”就是回文;如果忽略空格和标点符号,下面这个句子也是回 文,“A man, a plan, a canal: Panama”;数字 1001 也是回文。
使用栈,可以轻松判断一个字符串是否是回文。我们将拿到的字符串的每个字符按从左至右的顺序压入栈
。当字符串中的字符都入栈后,栈内就保存了一个反转后的字符串,最后的字符在栈顶,第一个字符在栈底,字符串完整压入栈内后,再通过持续弹出栈中的每个字母就可以得到一个新字符串
,该字符串刚好与原来的字符串顺序相反。我们只需要比较这两个字符串
即可,如果它们相等,就是一个回文。
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;
}
}