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>