算法与数据结构——栈

栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快,而且容易实现。

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; 
	} 
}
发布了263 篇原创文章 · 获赞 40 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/jbj6568839z/article/details/104673460
今日推荐