js数据结构与算法----栈与队列

来源:互联网 发布:linux 解压war包 编辑:程序博客网 时间:2024/05/16 09:38
栈是一种遵从后进先出原则的有序集合。新添加的或者待删除的元素都保存在栈的末尾,称作栈顶,另一端就称作是栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。

创建一个类来表示 栈
  1. function Stack() {
  2. var items = [];
  3. this.push = function(element){//添加元素
  4. items.push(element);
  5. };
  6. this.pop = function(){//删除元素
  7. return items.pop();
  8. };
  9. this.peek = function(){
  10. return items[items.length-1];//返回栈顶的元素
  11. };
  12. this.isEmpty = function(){
  13. return items.length == 0;//检查栈是否为空
  14. };
  15. this.size = function(){
  16. return items.length;//返回栈里的元素的数量
  17. };
  18. this.clear = function(){
  19. items = [];//清空栈
  20. };
  21. this.print = function(){
  22. console.log(items.toString());//显示栈里的内容
  23. };
  24. }
十进制转换二进制算法
  1. function divideBy2(decNumber){
  2. var stack=new Stack();
  3. //利用stack实现十进制到二进制的转换算法
  4. var rem,binaryString = '';
  5. while(decNumber>0){
  6. rem=Math.floor(decNumber % 2);
  7. stack.push(rem);
  8. decNumber=Math.floor(decNumber / 2)
  9. }
  10. while(!stack.isEmpty()){
  11. binaryString+=remStack.pop().toString();
  12. }
  13. return binaryString;
  14. }
  15. divideBy2(10) //1010
队列
队列是遵循先进先出原则的一组有序的项。队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。

创建一个类来表示  队列
  1. function Queue(){
  2. //这里是属性和方法
  3. var items=[];
  4. this.enqueue = function(element){
  5. items.push(element);//添加元素(最后)
  6. };
  7. this.dequeue=function(){
  8. return items.shift();//移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。
  9. };
  10. this.front=function(){
  11. return items[0];//返回队列的第一个元素
  12. };
  13. this.isEmpty = function(){
  14. return items.length == 0;
  15. };
  16. this.clear = function(){
  17. items = [];
  18. };
  19. this.size = function(){
  20. return items.length;
  21. };
  22. this.print = function(){
  23. console.log(items.toString());
  24. };
  25. }

优先队列
实现一个优先队列,有两种选项:设置优先级,然后正确的位置里添加元素;或者用入列操作添加元素,然后按照优先级移除他们。在这个示例中,我们将会在正确的位置添加元素,因此可以对它们使用默认的出列操作:
  1. function PriorityQueue() {
  2. var items = [];
  3. function QueueElement(element, priority) { // {1}
  4. this.element = element;
  5. this.priority = priority;
  6. }
  7. this.enqueue = function (element, priority) {
  8. var queueElement = new QueueElement(element, priority);
  9. if (this.isEmpty()) {
  10. items.push(queueElement); // {2}
  11. } else {
  12. var added = false;
  13. for (var i = 0; i < items.length; i++) {
  14. if (queueElement.priority <
  15. items[i].priority) {
  16. items.splice(i, 0, queueElement); // {3}
  17. added = true;
  18. break; // {4}
  19. }
  20. }
  21. if (!added) { //{5}
  22. items.push(queueElement);
  23. }
  24. }
  25. };
  26. //其他方法和默认的Queue实现相同
  27. }
默认的Queue类和PriorityQueue类实现上的区别是,要向PriorityQueue添加元素,需要创建一个特殊的元素,(行{1})。这个元素包含了要添加到队列的元素(它可以是任意类型)及其在队列中的优先级。
如果队列为空,可以直接将元素入列(行{2})。否则,就需要比较该元素与其他元素的优先级。当找到一个比要添加的元素的priority值更大(优先级更低)的项时,就把新元素插入到它之前(根据这个逻辑,对于其他优先级相同,但是先添加到队列的元素,我们同样遵循先进先出的原则)。要坐到这一点,我们可以用JavaScript的array累的splice方法。一旦找到priority值更大的元素,就插入新元素(行{3})并终止队列循环(行{4})。这样,队列也就根据优先级排序了。
如果要添加元素的priority值大于任何已有的元素,把它添加到队列的末尾就行了(行{5})。
  1. var priorityQueue = new PriorityQueue();
  2. priorityQueue.enqueue("John", 2);
  3. priorityQueue.enqueue("Jack", 1);
  4. priorityQueue.enqueue("Camila", 1);
  5. priorityQueue.print();
第一个被添加的元素是优先级为2的John,因为此前队列为空,所以它是队列中唯一的元素。接下来,添加了优先级为1的Jack,由于Jack的优先级高于John,它就成了队列中的第一个元素。然后,添加了优先级也为1的Camila。Camila的优先级和Jack相同,所以它会被插入到Jack之后(因为Jack先被插入队列);Camila的优先级高于John,所以它会被插入到John之前。

0 0
原创粉丝点击