栈是一种遵从后进先出原则的有序集合。新添加的或者待删除的元素都保存在栈的末尾,称作栈顶,另一端就称作是栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
创建一个类来表示 栈
function Stack() {var items = [];this.push = function(element){//添加元素items.push(element);};this.pop = function(){//删除元素return items.pop();};this.peek = function(){return items[items.length-1];//返回栈顶的元素};this.isEmpty = function(){return items.length == 0;//检查栈是否为空};this.size = function(){return items.length;//返回栈里的元素的数量};this.clear = function(){items = [];//清空栈};this.print = function(){console.log(items.toString());//显示栈里的内容};}
十进制转换二进制算法
function divideBy2(decNumber){var stack=new Stack();//利用stack实现十进制到二进制的转换算法var rem,binaryString = '';while(decNumber>0){rem=Math.floor(decNumber % 2);stack.push(rem);decNumber=Math.floor(decNumber / 2)}while(!stack.isEmpty()){binaryString+=remStack.pop().toString();}return binaryString;}divideBy2(10) //1010
队列
队列是遵循先进先出原则的一组有序的项。队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。
创建一个类来表示 队列
function Queue(){//这里是属性和方法var items=[];this.enqueue = function(element){items.push(element);//添加元素(最后)};this.dequeue=function(){return items.shift();//移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。};this.front=function(){return items[0];//返回队列的第一个元素};this.isEmpty = function(){return items.length == 0;};this.clear = function(){items = [];};this.size = function(){return items.length;};this.print = function(){console.log(items.toString());};}
优先队列
实现一个优先队列,有两种选项:设置优先级,然后正确的位置里添加元素;或者用入列操作添加元素,然后按照优先级移除他们。在这个示例中,我们将会在正确的位置添加元素,因此可以对它们使用默认的出列操作:
function PriorityQueue() {var items = [];function QueueElement(element, priority) { // {1}this.element = element;this.priority = priority;}this.enqueue = function (element, priority) {var queueElement = new QueueElement(element, priority);if (this.isEmpty()) {items.push(queueElement); // {2}} else {var added = false;for (var i = 0; i < items.length; i++) {if (queueElement.priority <items[i].priority) {items.splice(i, 0, queueElement); // {3}added = true;break; // {4}}}if (!added) { //{5}items.push(queueElement);}}};//其他方法和默认的Queue实现相同}
默认的Queue类和PriorityQueue类实现上的区别是,要向PriorityQueue添加元素,需要创建一个特殊的元素,(行{1})。这个元素包含了要添加到队列的元素(它可以是任意类型)及其在队列中的优先级。
如果队列为空,可以直接将元素入列(行{2})。否则,就需要比较该元素与其他元素的优先级。当找到一个比要添加的元素的priority值更大(优先级更低)的项时,就把新元素插入到它之前(根据这个逻辑,对于其他优先级相同,但是先添加到队列的元素,我们同样遵循先进先出的原则)。要坐到这一点,我们可以用JavaScript的array累的splice方法。一旦找到priority值更大的元素,就插入新元素(行{3})并终止队列循环(行{4})。这样,队列也就根据优先级排序了。
如果要添加元素的priority值大于任何已有的元素,把它添加到队列的末尾就行了(行{5})。
var priorityQueue = new PriorityQueue();priorityQueue.enqueue("John", 2);priorityQueue.enqueue("Jack", 1);priorityQueue.enqueue("Camila", 1);priorityQueue.print();
第一个被添加的元素是优先级为2的John,因为此前队列为空,所以它是队列中唯一的元素。接下来,添加了优先级为1的Jack,由于Jack的优先级高于John,它就成了队列中的第一个元素。然后,添加了优先级也为1的Camila。Camila的优先级和Jack相同,所以它会被插入到Jack之后(因为Jack先被插入队列);Camila的优先级高于John,所以它会被插入到John之前。
数据结构精讲
本文介绍了栈、队列和优先队列的基本概念及其实现方法,包括栈的后进先出特性、队列的先进先出原则,以及优先队列如何通过设定优先级来管理元素的顺序。

被折叠的 条评论
为什么被折叠?



