栈(Stack)
栈是一种遵循后进先出(LIFO, Last In First Out)原则的有序集合。新添加或者待删除的元素都保存在栈的末尾,称作栈顶,另一端叫做栈底。
创建一个类来表示栈,首先先声明这个类:
function Stack() {
// 声明各种属性和方法
}
为栈声明如下的方法:
push(element(s)):添加一个(或几个)新元素到栈顶。
pop():移除栈顶的元素,同时返回被移除的元素。
peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)。
isEmpty():如果栈里没有任何元素就返回true,否则返回false。
clear():移除栈里的所有元素。
size():返回栈里的元素个数。这个方法和数组的length属性很类似。
print():输出栈里的元素。
function Stack() {
var items = [];
this.push = function(element) {
items.push(element);
};
this.pop = function() {
items.pop();
};
this.peek = function() {
return items[items.length - 1];
};
this.isEmpty = function() {
return items.length === 0;
};
this.clear = function() {
items = [];
};
this.size = function() {
return items.length;
};
this.print = function() {
console.log(items.toString());
};
}
使用栈
var stack = new Stack(); // 初始化栈
console.log(stack.isEmpty()); // true
// 往栈里添加元素
stack.push(1);
stack.push(2);
// 获取栈顶的元素
console.log(stack.peek()); // 2
stack.push(9);
console.log(stack.size()); // 3
console.log(stack.isEmpty()); // false
stack.push(20);
// 移除栈顶的元素
stack.pop(); // 20被移除
stack.pop(); // 9被移除
console.log(stack.size()); // 2
stack.print(); // 输出[1, 2]
栈在计算机科学中,可以解决十进制转化为其他进制的问题
function baseConverter(decNumber, base) {
var stack = new Stack(),
rem,
baseString = '',
digits = '0123456789ABCDEF';
while(decNumber > 0) {
rem = Math.floor(decNumber % base);
stack.push(rem);
decNumber = Math.floor(decNumber / base);
}
while(!stack.isEmpty()) {
baseString += digits[stack.pop()];
}
return baseString;
}
console.log(baseConverter(100345, 2)); //输出11000011111111001
console.log(baseConverter(100345, 8)); //输出303771
console.log(baseConverter(100345, 16)); //输出187F9
队列(Queue)
队列是遵循先进先出(FIFO,First In First Out,也称为先来先服务)原则的一组有序的项,类似于日常生活中排队、打印文档。最新添加的元素排在队列的末尾,从队列的顶部移除元素。
为队列声明如下的方法:
enqueue(element(s)):向队列尾部添加一个(或多个)新的项。
dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。
front():返回队列中第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息——与Stack类的peek方法非常类似)。
isEmpty():如果队列中不包含任何元素,返回true,否则返回false。
size():返回队列包含的元素个数,与数组的length属性类似。
function Queue() {
var items = [];
this.enqueue = function(element) {
items.push(element);
};
this.dequeue = function() {
items.shift();
};
this.front = function() {
return items[0];
};
this.isEmpty = function() {
return items.length === 0;
};
this.size = function() {
return items.length;
};
this.clear = function() {
items = [];
};
this.print = function() {
console.log(items.toString());
};
}
使用队列
var queue = new Queue(); // 初始化队列
console.log(queue.isEmpty()); // true
// 向队列添加元素
queue.enqueue('hello');
queue.enqueue('world');
console.log(queue.size()); // 2
queue.enqueue('!');
// 出队,先进先出
queue.dequeue(); // hello出队
queue.dequeue(); // world出队
queue.print(); // ['!']
链表
链表是一种动态的数据结构,可以在任意处添加或删除元素,它会按需进行扩容。
链表存储有序的数据集合,但不同于数组,链表中的元素在内存中并不是有序放置的。每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成。