数据结构之栈、队列

1.栈的封装 (Stack.js)

// 栈的封装
class Stack {
    constructor() {
        this.item = []; //存储栈元素
    }
    // 向栈中添加元素
    push(ele) {
        this.item.push(ele)
    }
    // 移除栈顶元素
    pop() {
        return this.item.pop()
    }
    // 返回栈顶元素
    peek() {
        return this.item[this.item.length - 1]
    }
    // 判空
    isEmpty() {
        return this.item.length == 0
    }
    // 清空栈
    clear() {
        this.item = []
    }
    // 元素个数
    size() {
        return this.item.length
    }
}

2.进制转换

    <script src="./Stack.js"></script>
    <script>
        function dec2bin(Numer, base) {
            // 1.创建栈
            let stack = new Stack();

            // 2.余数压栈
            while (Numer > 0) {
                let yushu = Numer % base;
                stack.push(yushu);
                Numer = Math.floor(Numer / base);
            }

            // 3.依次出栈
            let str = "";
            while (!stack.isEmpty()) {
                str += stack.pop();
            }

            return str;

        }
        console.log(dec2bin(100, 2));
    </script>

2.括号匹配

设计一个括号是否匹配的方法 (栈)  

匹配:([{}])    ([])      

不匹配: ()]     [()     {[}]

<script src="./Stack.js"></script>
    <script>
        function isMatch(str) {
            let arr = [...str];//转为数组

            // 1.建立栈
            let stack = new Stack();

            // 遍历
            for (let i = 0; i < arr.length; i++) {
                // 2.左括号入栈
                if (arr[i] == '(' || arr[i] == '{' || arr[i] == "[") {
                    stack.push(arr[i]);

                }
                else {//遇到右括号
                    switch (arr[i]) {
                        case ')':
                            if (stack.pop() != "(") {
                                return false;
                            }
                            break;
                        case '}':
                            if (stack.pop() != "{") {
                                return false;
                            }
                            break;
                        case ']':
                            if (stack.pop() != "[") {
                                return false;
                            }
                            break;
                    }

                }
            }

            // 判断栈是否为空
            if (stack.isEmpty()) {
                return true;
            } else {
                return false;
            }
        }
        console.log(isMatch("([{}])"));
        console.log(isMatch("[(})"));
        console.log(isMatch("[()"));
        console.log(isMatch("{}]"));

3.击鼓传花

 <script src="./Queue.js"></script>
    <script>
        function jigu(arr) {
            // 1.创建一个队列
            let queue = new Queue();

            // 2.入队
            arr.forEach(ele => {
                queue.enqueue(ele);
            });

            // 3.开始数数
            let count = 1;
            while (queue.size() > 1) {
                if (count < 3) {
                    let delperson = queue.delqueue();//出队
                    queue.enqueue(delperson);//入队
                    count++;
                } else {
                    queue.delqueue();//出队
                    count = 1;
                }
            }

            return {
                winner: queue.front(), //胜利的人
                postion: arr.indexOf(queue.front())  //胜利的人原位置
            }

        }
        var arr = ["aaa", "bbb", "ccc", "ddd", "eee"];
        console.log(jigu(arr));

    </script>

4.判断当前字符串是不是回文数

    <script src="./Stack.js"></script>
    <script>
        function huiwen(str) {
            // 1.建立栈
            let stack = new Stack();
            // 2.进栈
            for (let i = 0; i < str.length; i++) {
                stack.push(str[i]);
            }
            // 3.出栈
            let s = "";
            while (!stack.isEmpty()) {
                s += stack.pop();
            }

            // 4.比较
            if (s == str) {
                return "是回文";
            } else {
                return "不是回文";
            }

        }

        console.log(huiwen("aabbaa"));
        console.log(huiwen("aabcc"));
        console.log(huiwen("abbcc"));
    </script>

5.佩兹糖果盒

 现实生活中栈的一个例子是佩兹糖果盒。想象一下你有一盒佩兹糖果,里面塞满了红色、黄色和白色的糖果,但是你不喜欢黄色的糖果。

 使用栈(有可能用到多个栈)写一段程序,在不改变盒内其他糖果叠放顺序的基础上,将黄色糖果移出。

            var sweetBox = new Stack();

            sweetBox.push('red');

            sweetBox.push('yellow');

            sweetBox.push('red');

            sweetBox.push('yellow');

            sweetBox.push('white');

            sweetBox.push('yellow');

            sweetBox.push('white');

            sweetBox.push('yellow');

            sweetBox.push('white');

            sweetBox.push('red');

 <script src="./Stack.js"></script>
    <script>
        var sweetBox = new Stack();
        sweetBox.push('red');
        sweetBox.push('yellow');
        sweetBox.push('red');
        sweetBox.push('yellow');
        sweetBox.push('white');
        sweetBox.push('yellow');
        sweetBox.push('white');
        sweetBox.push('yellow');
        sweetBox.push('white');
        sweetBox.push('red');

        function Box(sweetBox) {
            let BufferBox = new Stack();
            // 1.入栈
            while (!BufferBox.isEmpty()) {
                if (sweetBox.peek() != "yellow") {
                    BufferBox.push(sweetBox.pop())
                } else {
                    sweetBox.pop();
                }
            }

            // 2.出栈
            while (!BufferBox.isEmpty()) {
                sweetBox.push(BufferBox.pop());
            }
            return sweetBox;
        }
        console.log(Box(sweetBox));

    </script>

6.约瑟夫环

队列的封装(Queue.js)

// 队列的封装
class Queue {
    constructor() {
        this.item = [];
    }
    // 入队
    enqueue(element) {
        this.item.push(element);
    }

    // 出队
    delqueue() {
        return this.item.shift();
    }

    // 返回队首元素
    front() {
        return this.item[0];
    }
    // 判空
    isEmpty() {
        return this.item.length == 0;
    }

    size() {
        return this.item.length;
    }
}
<script src="Queue.js"></script>
    <script>
        function jigu(arr) {

            // 创建一个队列
            let queue = new Queue();

            // 1.依次入队
            arr.forEach(ele => {
                queue.enqueue(ele)
            });

            // 2.开始数数
            let count = 1;

            while (queue.size() > 2) {

                if (count < 3) {
                    let delperson = queue.delqueue();
                    queue.enqueue(delperson);
                    count++
                } else {
                    queue.delqueue();
                    count = 1;
                }

            }

            return queue.item
        }


        let arr = [];
        for (let i = 1; i <= 41; i++) {
           arr.push(i)
        }
        console.log(jigu(arr));
    </script>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值