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);

 

posted @ 2019-01-16 21:21  orxx  阅读(272)  评论(0编辑  收藏  举报