zoukankan      html  css  js  c++  java
  • JS-常用的数据结构之栈和队列

    具体实现

      

     1 // js栈实现  使用数组
     2 // 栈的原则先进后出(LIFO),每次操作的是栈顶元素
     3 function Stack(){
     4     var items = [];
     5     
     6     this.push = function(element){
     7         items.push(element);
     8     }; //添加一个新元素到栈顶。
     9 
    10     this.pop = function(){
    11         return items.pop();
    12     };//移除栈顶的元素,同时返回被移除的元素。
    13 
    14     this.peek = function(){
    15         return items[items.length - 1];
    16     };//返回栈顶的元素,不对栈做任何修改。
    17 
    18     this.isEmpty = function(){
    19         return items.length == 0;
    20     };//如果栈里没有任何元素就返回true,否则返回false。
    21 
    22     this.clear = function(){
    23         items = [];
    24     };//移除栈里的所有元素。
    25 
    26     this.size = function(){
    27         return items.length;
    28     };//返回栈里的元素个数。
    29 }
    30 
    31 var a1 = new Stack();
    32 a1.push(1);
    33 
    34 a1.peek();
    35 
    36 // 使用栈实现十进制转二进制
    37 //十进制整数转换为二进制整数采用"除2取余,逆序排列"法。
    38 //具体做法是:用2整除十进制整数,可以得到一个商和余数;
    39 //再用2去除商,又会得到一个商和余数,
    40 //如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来
    41 function divideBy2(decNumber){
    42     var remStack = new Stack();
    43     var rem = null;
    44     binarString = "";
    45 
    46     while (decNumber > 0 ){
    47         rem = Math.floor(decNumber % 2);
    48         remStack.push(rem);
    49         decNumber = Math.floor(decNumber / 2);
    50     }
    51 
    52     while(!remStack.isEmpty()){
    53         binarString += remStack.pop().toString();
    54     }
    55     return binarString;
    56 }
    57 
    58 // 十进制转16 比转2多了一步,数值到字母的映射
    59 function baseConverter (decNumber, base) {
    60     var remStack = new Stack(),
    61         rem,
    62         baseString = "",
    63         digits = "0123456789ABCDEF";
    64 
    65     while (decNumber > 0) {
    66         rem = Math.floor(decNumber % base);
    67         remStack.push(rem);
    68         decNumber = Math.floor(decNumber / base);
    69     }
    70 
    71     while (!remStack.isEmpty()) {
    72         baseString += digits[remStack.pop()];
    73     }
    74     return baseString;
    75 }
    76 
    77 document.write(divideBy2(12));

    队列实现

    参考链接  https://blog.csdn.net/weixin_38181873/article/details/78149442

      1 function Queue () {
      2     var items = [];
      3 
      4     // this.enqueue  和 enqueue的区别??? 测试发现不加this 调用不了此函数
      5     this.enqueue = function(element){
      6         items.push(element);
      7     }; //向队列尾部添加一个新的项。
      8     this.dequeue = function(){
      9         return items.shift();
     10     };//移除队列的第一项,并返回被移除的项。
     11     this.front = function(){
     12         return items[0];
     13     };//返回队列中的第一个元素,队列不做任何变动。
     14     this.isEmpty = function(){
     15         return items.length == 0;
     16     };//判断队列是否为空。
     17     this.size = function(){
     18         return items.length;
     19     };//返回队列长度。
     20     this.print = function () {
     21         console.log(items.toString());
     22     };
     23 }
     24 
     25 
     26  var aa = new Queue();
     27  aa.enqueue(1);
     28 
     29  // 优先队列
     30  function PriorityQueue () {
     31     var items = [];
     32 
     33     // priority越大,优先级越高
     34     function QueueElement(element, priority){
     35         this.element = element;
     36         this.priority = priority;
     37     }
     38 
     39     this.enqueue = function(element){
     40         var qe = new QueueElement(element, priority);
     41 
     42         if (this.isEmpty()){
     43             items.push(qe);
     44         }else{
     45             // splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素, 要删除的项目数量。如果设置为 0,则不会删除项目
     46 
     47             //循环比较所添加元素和队列中元素优先级
     48             //当找到比要添加元素优先级更小的项时,就把新元素插入到它之前(priority越大,优先级越高)
     49             var isAdd = false;
     50             for(let i = 0; i < items.length; i++){
     51                 if (qe.priority > item[i].priority){
     52                     items.splice(i, 0, qe);
     53                     isAdd = true;
     54                     break;
     55                 }
     56             }
     57             //优先级相同,遵循先进先出原则
     58             if (!isAdd){
     59                 items.push(qe);
     60             }
     61         }
     62     }; //向队列尾部添加一个新的项。
     63     this.dequeue = function(){
     64         return items.shift();
     65     };//移除队列的第一项,并返回被移除的项。
     66     this.front = function(){
     67         return items[0];
     68     };//返回队列中的第一个元素,队列不做任何变动。
     69     this.isEmpty = function(){
     70         return items.length == 0;
     71     };//判断队列是否为空。
     72     this.size = function(){
     73         return items.length;
     74     };//返回队列长度。
     75     this.print = function () {
     76         console.log(items.toString());
     77     };
     78  }
     79 
     80 
     81  // 击鼓传花游戏  假设每一轮数5次
     82 
     83  function hotPotato(nameList, num){
     84     var que = new Queue();
     85     var eliminated = "";
     86     // 先全部进队
     87     for(let i = 0; i < nameList.length; i++){
     88         que.enqueue(nameList[i]);
     89     }
     90 
     91     // 循环执行直到队列只剩下一个元素
     92     while (que.size() > 1){
     93         for (let j = 0; j < num; j++){
     94             // 先出队,再进队
     95             var temp = que.dequeue();
     96             que.enqueue(temp);
     97         }
     98         // 一次循环结束,队首的人被淘汰
     99         eliminated = queue.dequeue();
    100         console.log(eliminated + "被淘汰");
    101     }
    102 
    103     return queue.dequeue();
    104  }
    105 
    106 var names = ["小明", "小花", "小黄", "小易", "小华"];
    107 var winner = hotPotato(names, 5);//可以改变传入数字,模拟不同场景
    108 console.log("胜利者:" + winner);
  • 相关阅读:
    java学习笔记 (2) —— Struts2类型转换、数据验证重要知识点
    java学习笔记 (1) —— Strut2.3.24环境搭建
    数据不平衡问题的处理
    正则化与特征稀疏,过拟合
    leetcode144-先序遍历非递归实现
    解释器资料
    ROC,AUC
    假设检验——KS检验
    SVM理解
    高斯过程与核密度估计
  • 原文地址:https://www.cnblogs.com/orxx/p/10279478.html
Copyright © 2011-2022 走看看