题目一
有6个元素:654321。下列哪一个不是合法的出栈序列?
A:543612 B:453216 C:34652C D:23415D
思路
首先我们都知道,栈的方式是后进先去 LIFO(last in first out)。
千万不要觉得 A、B、C、D答案都是错的。只有6,5,4,3,2,1出栈的方式是对的,这只是很多种方式中的一种。
正确的解题思路是不一定要等到其他元素都进栈后 再出栈。比如以A的方式进行模拟。
A: 6进栈 5进栈 5出栈 4进栈 4出栈3进栈3出栈 6出栈 2进栈 1进栈1出栈 2出栈
画图思考,这里通过答案A的方式进行一个gif的示例。
遵循 LIFO 的规则,在进行 C的顺序操作的时候,
小结
主要就是去理解下,栈结构。它是一种受限的线性结构,后进先出(LIFO)。
-
其限制是仅允许在 表的一端 进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
-
LIFO(last in first out)表示就是后进入的元素, 第一个弹出栈空间。
-
向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素。
-
从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
ts封装栈结构
一般在stack 结构中,包含
push压栈的方法pop出栈的方法,并返回弹出栈的元素peek返回栈顶的元素isEmpty判断栈中是否还有元素size返回栈中元素的个数
代码传送门:封装stack结构完整代码
/**
* 基于数组的方式实现一个栈结构
*
*/
class ArrayStack<T> implements IStack<T> {
private data: T[] = [];
push(element: T): void {
this.data.push(element);
}
pop(): T | undefined {
return this.data.pop();
}
peek(): T | undefined {
return this.data[this.data.length - 1];
}
isEmpty(): boolean {
return this.data.length === 0;
}
size(): number {
return this.data.length;
}
}
题目二
十进制转二进制?
给定一个任意数字,如图所示进行。将该十进制数字和2整除(二进制是满
二进一),直到结果是0为止。最后将余数反向有序的进行拼接。得到结果
- 先将 十进制的数字 % 2,将余数压入栈中。
- 遍历栈中的元素,并将结果拼接
function decimalToBinary(decimal: number): string {
const stack = new ArrayStack<number>();
while (decimal > 0) {
const result = decimal % 2;
stack.push(result);
decimal = Math.floor(decimal / 2);
}
let binary = "";
while (!stack.isEmpty()) {
binary += stack.pop();
}
return binary;
}
代码传送门:完整代码
题目三
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
-
每个右括号都有一个对应的相同类型的左括号。
力扣中题目
这道题目还是比较有意思的。核心点:括号之间是一一对应的关系。
比如 当字符串中出现 左括号
( 其对应的就是右括号 ),
- 在遍历字符串的时候进行判断,在遇到左边的括号的时候,将其对应的右括号压入栈中。
- 如果遍历的时候遇到右括号,将栈的元素弹出并进行比较。如果不相等那么不一致。
- 最后判断栈中的元素是否都弹出。
function isValid(s: string): boolean {
const stack = new ArrayStack<string>();
for (let i = 0; i < s.length; i++) {
const iAt = s[i];
if (iAt == "(") {
stack.push(")");
} else if (iAt == "{") {
stack.push("}");
} else if (iAt == "[") {
stack.push("]");
} else {
if (iAt !== stack.pop()) {
return false;
}
}
}
return stack.isEmpty();
}
代码传送门:完整代码
一点想法
如今的处境好像有点难,除了八股文,还要准备 刷算法,再读一读 读源码。跟之前的基础三件套html、js、css相比。我暂时把这些定义后三件套吧。前端真有意思哈~(ps:是真的卷阿)。你们怎么看尼~欢迎评论区留言吧