关于栈:栈和队列

栈和队列一、对于模仿栈应用何种模型 1.程序表:尾插尾删很快,缓存利用率高,然而要扩容 2.单链表:应用链表头作为栈顶来插入删除数据也很快 3.带头双向循环链表:也能够,工夫也是O(1) 二、栈的模仿实现 //"stack.h"typedef int type;typedef struct stack{ type* a; int top; int capacity;}st;//stack.c#include"stack.h"void st_init(st* sta){ assert(sta); sta->a = NULL; sta->top = 0;//数组下标的意思,是数据下一个下标,外面没有值;top = -1,则是top指向最初一个元素 sta->capacity = 0;}void st_push(st* sta, type x){ assert(sta); if (sta->top == sta->capacity) { //满了 int newcapa = sta->capacity == 0 ? 4 : 2 * sta->capacity; type* t = realloc(sta->a, sizeof(type) * newcapa);//扩容;如果a== NULL,它的行为就和malloc一样 if (t == NULL) { printf("realloc fail\n"); exit(-1); } sta->a = t; sta->capacity = newcapa; } sta->a[sta->top] = x; ++sta->top;}void st_destroy(st* sta){ assert(sta); free(sta->a); sta->a = NULL; sta->top = 0; sta->capacity = 0;}void st_pop(st* sta){ assert(sta); assert(sta->top > 0); sta->top--;}type st_top(st* sta){ assert(sta); assert(sta->top > 0); return sta->a[sta->top - 1];}bool st_empty(st* sta){ assert(sta); return sta->top == 0;}int st_size(st* sta){ assert(sta); return sta->top; }三、根底oj ...

May 18, 2023 · 5 min · jiezi

关于栈:java打印栈空间

如果在一个黑盒的测试过程中,咱们无奈通过debug的形式来单步调试程序,那么怎么能力晓得一个对象的值呢?通过print函数进行打印。对应的java语法就是: System.out.println(obj);对于一个对象或者一个数组对象是很容易通过打印或者遍历之后打印对象的值。那么对于栈的数据结构怎么遍历呢?认为遍历之后,栈中的每一个元素都要弹出栈,咱们须要弹出之后再进行压栈的操作。那么有没有简略的形式进行操作呢?能够的!办法就是通过copy栈中的数据,再遍历。那么有没有clone函数呢?我是没有找到(能够在钻研下)。另外一个形式就是开拓一个新的空间,把栈当做对象增加到新的栈空间中。 public void printStack(Stack<TreeNode> stack){ Stack<TreeNode> copy = new Stack<>(); copy.addAll(stack); while(!copy.isEmpty()){ System.out.println(copy.pop().val); }}public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }}

September 29, 2022 · 1 min · jiezi

关于栈:栈的使用习惯

栈的应用习惯零碎在应用栈开拓内存空间时,是先应用高地址处的空间,而后在应用低地址处的空间。数组、函数传参等,开拓内存空间时,都是从右到左顺次开拓的。//下列这个程序会死循环int main(){ int i = 0; //先在栈的高地址开拓b的空间, int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; //而后在低地址开拓arr的空间(先开拓10的空间,而后再是9、8 ....) for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hehehe\n"); } return 0;}//上述程序中,for循环中 arr[i] 的拜访溢出了(越界拜访),溢出到arr[12]的地址//然而arr[12]的地址可能与变量 i 重合了//所以给arr[12]的地址赋值为0,同时也会把变量 i 也赋值为0栈中内存构造如下:

June 19, 2022 · 1 min · jiezi

关于栈:栈与队列

1.栈是只运行在一端操作的线性表。n个元素进栈,出栈元素不同排列个数为2n!/n!/(n+1) 一般栈:#define Maxsize 10typedef struct{ ElemType data[Maxsize]; int top;......栈顶指针,因为栈实质上是数组,所以指针能够简化为一个数}Sqstack;共享栈:typedef struct{ ElemType data[Maxsize]; int top0; int top1;}Shstack;void InitStack(Shstack &S){ S.top0=-1; S.top1=Maxsize;}栈满条件:top0+1=top12.队列是在一端进,一端出的线性表 #define Maxsize 10typedef struct{ ElemType data[Maxsize]; int front,rear;}SqQueue;3.队列的插入与删除因为队列波及到来头尾的问题,所以为了运算不便,咱们应用模运算将队列在逻辑上变为环形 bool EnQueue(SqQueue &Q,Elemtype x){ if((Q.rear+1)%MaxSize==Q.front) return false; Q.data[Q.rear]=x; Q.rear=(Q.rear+1)%Maxsize; return true;}bool DeQueue(SqQueue &Q,Elemtype &x){ if(Q.rear+1==Q.front) return false; Q.data[Q.front]=x; Q.front=(Q.front+1)%Maxsize; return true;}4.判断队列空满的形式计划一:就义了一个存储空间(即rear指向的那个地位) 计划二: 计划三: 5.其余出题形式 有时rear指向的是队尾元素所在位置(起始时rear=front=0)(后面所写代码和判断形式均建设在这种形式上),有时指向的是队尾元素的下一个地位(起始时rear=n-1,front=0) 前一种:Q.data[Q.rear]=x;Q.rear=(Q.rear+1)%Maxsize;后一种:Q.rear=(Q.rear+1)%Maxsize;Q.data[Q.rear]=x;然而对于后一种,咱们不能通过(Q.rear+1)%MaxSize==Q.front判断队满,因为它的队空是这样判断的,因而咱们能够就义一个存储单元,即当rear=n-2,front=0时就队满,或者通过设置size来判断

June 6, 2022 · 1 min · jiezi

关于栈:算法栈

栈先入后出 栈的利用如果数据保留的程序和应用程序相同,那么最初保留的数据最先被应用,具备“后入先出”的特点,所以能够思考将数据保留到栈中。 后缀表达式题目:后缀表达式是一种算术表达式,它的操作符在操作数的前面。输出一个用字符串数组示意的后缀表达式,请输入该后缀表达式的计算结果。假如输出的肯定是无效的后缀表达式。例如,后缀表达式["2","1","3","","+"]对应的算术表达式是“2+13”,因而输入它的计算结果5。/** * @param {string[]} tokens * @return {number} */var evalRPN = function(tokens) { let stack = [] for(const token of tokens) { switch(token) { case "+": case "-": case "*": case "/": let num1 = stack.pop(); let num2 = stack.pop(); stack.push(calculate(num2, num1, token)) break; default: stack.push(Number(token)) } } return stack.pop()};var calculate = function(num1, num2, operator) { switch(operator) { case "+": return num1 + num2; case "-": return num1 - num2; case "*": return num1 * num2; case "/": return num1 / num2 > 0 ? Math.floor(num1 / num2) : Math.ceil(num1 / num2); }}小行星碰撞题目:输出一个示意小行星的数组,数组中每个数字的绝对值示意小行星的大小,数字的正负号示意小行星静止的方向,正号示意向右航行,负号示意向左航行。如果两颗小行星相撞,那么体积较小的小行星将会爆炸最终隐没,体积较大的小行星不受影响。如果相撞的两颗小行星大小雷同,那么它们都会爆炸隐没。航行方向雷同的小行星永远不会相撞。求最终剩下的小行星。例如,有6颗小行星[4,5,-6,4,8,-5],如图6.2所示(箭头示意航行的方向),它们相撞之后最终剩下3颗小行星[-6,4,8]。var asteroidCollision = function(anteroids) { const stack = []; for(let i = 0; i < anteroids.length; i++) { while(stack.length && stack[stack.length-1] > 0 && stack[stack.length-1]<-anteroids[i]) { stack.pop() } if(stack.length && anteroids[i] < 0 && stack[stack.length-1] == -anteroids[i]) { stack.pop() } else if (!stack.length || anteroids[i]>0 || stack[stack.length-1] < 0) { stack.push(anteroids[i]) } } return stack;}每日温度题目:输出一个数组,它的每个数字是某天的温度。请计算每天须要等几天才会呈现更高的温度。例如,如果输出数组[35,31,33,36,34],那么输入为[3,1,1,0,0]。因为第1天的温度是35℃,要等3蠢才会呈现更高的温度36℃,因而对应的输入为3。第4天的温度是36℃,前面没有更高的温度,它对应的输入是0。其余的以此类推。暴力法// 写错了,搞成最高温度var dailyTemperatures(temperatures) { let result = [] for(let i = 0; i < temperatures.length; i++) { let max = 0; let count = 0; for(let j = i + 1; j < temperatures.length; j++) { if(temperatures[j]-temperatures[i]>max) { count = j - i } max = Math.max(max, temperatures[j]-temperatures[i]) } result.push(count) } return result;}栈/** * @param {number[]} temperatures * @return {number[]} */var dailyTemperatures = function(temperatures) { const result = new Array(temperatures.length).fill(0) const stack = [] for(let i = 0; i < temperatures.length; i++) { while(stack.length && temperatures[i] > temperatures[stack[stack.length - 1]]) { let prev = stack.pop(); result[prev] = i - prev } stack.push(i); } return result;};假如输出数组的长度为n。尽管上述代码中有一个嵌套的二重循环,但它的工夫复杂度是O(n),这是因为数组中每个温度入栈、出栈各1次。这种解法的空间复杂度也是O(n)。 ...

May 31, 2022 · 2 min · jiezi

关于栈:Go数据结构破冰之路二栈的爱恨情仇

栈定义// 线性表的一种,构造上一端凋谢、一端关闭// 凋谢的一端,容许进行插入和删除操作,称为栈顶// 关闭的一端,成为栈底// 依据定义写出栈的结构构造体(假设栈中都是整型元素)type Stack struct { // 一个寄存栈元素的容器 container []int // 栈顶标记 top int // 容量限度 size int}// 依据构造体写出栈的构造方法func NewStack(size int) *Stack { // 返回的是Stack构造体指针 return &Stack{ // 用切片来示意栈容器 container: make([]int, size), // 初始栈顶元素为0 top: 0, // 容量限度同入参size size: size, }}基本操作栈判空:栈顶标记为零栈判满:栈顶标记等于容量限度入栈:把某一元素放入栈顶出栈:把栈顶元素取出// 栈判空func (s *Stack) IsEmpty() bool { if s.top == 0 { return true } return false}// 栈判满func (s *Stack) IsFull bool { if s.top == s.size { return true } return false}// 入栈func (s *Stack) Push(e int) bool { if s.IsFull() { fmt.Println(false, e) return false } s.container[s.top] = e s.top++ fmt.Println(true, e) return true}// 出栈func (s *Stack) Pop() (flag bool, ret int) { if s.IsEmpty() { return false, ret } ret = s.container[s.top] s.top-- return true, ret}测试func main() { s := NewStack(5) s.Push(1) s.Push(2) s.Push(3) s.Push(4) s.Push(5) s.Push(6) fmt.Println(s.Pop()) fmt.Println(s.Pop()) fmt.Println(s.Pop()) fmt.Println(s.Pop()) fmt.Println(s.Pop()) fmt.Println(s.Pop())}// 运行后果true 1true 2true 3true 4true 5false 6true 5true 4true 3true 2true 1false 0

February 12, 2022 · 1 min · jiezi

关于栈:数据结构和算法-栈

1. 什么是栈(Stack)栈是一种数据结构。要阐明栈的定义,咱们须要从栈的个性说起,只有合乎这种个性的数据结构就能够叫做栈。 上面咱们来看看栈的个性是什么。 栈的个性是存入栈中的元素先进后出。先进后出是什么意思呢? 咱们思考有一个桶,桶有5层,每层只能放一个球,并且只有桶的最下面有个闭口用来放球和拿球。 当初假如咱们有三个球叫A,B,C,桶也是空的。 咱们依照A,B,C的先后顺序把球放进桶里,那么此时的桶外面的球的排布如下: 第五层 | | 第四层 | | 第三层 | C | 第二层 | B | 第一层 | A | 此时咱们再从桶里逐个把球拿进去。首先只能拿C球,把C球拿掉后能力拿B球,而后才是A球。 依据以上场景,咱们能够晓得放球程序是A,B,C;拿球程序是C,B,A。 即后面所说的栈的个性:先进后出,并且栈只提供栈顶供咱们放元素和取元素。 2. java实现栈能够通过链表实现,也能够通过数组实现。 背刺抉择双链表作为实现栈的载体。 对于链表以及双链表的实现,能够参考以前的文章: Segment Fault Bugkit package org.bugkit.structure;/** * @author bugkit * @since 2021.10.27 */public class LinkedList<E> extends AbstractList<E> implements List<E>, Queue<E>, Stack<E> { private Node<E> head; private Node<E> tail; // 创立一个空栈 public LinkedList() { tail = head = null; } // 放入元素到栈中 @Override public boolean push(E e) { Node<E> node = new Node<>(e); if (isEmpty()) { tail = head = node; }else{ node.prev = tail; tail.next = node; tail = node; } size++; return true; } // 取出栈中的一个元素 @Override public E pop() { if (isEmpty()) { throw new RuntimeException("Stack is empty"); } E e = tail.e; if (size() == 1) { tail = head = null; }else{ tail = tail.prev; tail.next = null; } size--; return e; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("LinkedList: { "); Node<E> node = head; while (node != null) { sb.append(node.e).append("<->"); node = node.next; } sb.append("null }"); return sb.toString(); } private static class Node<E> { E e; Node<E> next; Node<E> prev; public Node(E e) { this.e = e; } }}

October 29, 2021 · 1 min · jiezi

关于栈:JavaScript栈思想的应用实现智能重复函数

需要:实现一个“智能反复”函数,实现上面字符串的转换 将 2[abc] 转成 abcabc 将 2[1[a]2[b]] 转成 abbabb 将 2[1[a]2[3[b]4[c]]] 转成 abbbccccbbbccccabbbccccbbbcccc思路及原理原理:应用“栈”思维来实现,在JavaScript中实现“栈”的最好数据结构是数组思路: 1、定义两个栈(数组),栈1(stack1)、栈2(stack2),stack1用来存储数字,stack2用来存储字符串2、定义一个指针(索引),默认从0开始3、循环这个字符串,指针始终向后挪动,直到指针等于字符串长度减14、获取以后指针指向的这个字符,而后进行判断 a)、如果是数字 stack1中推入这个数字,stack2中推入一个空字符,指针持续向后挪动b)、如果是“[” 什么都不做,指针持续向后挪动c)、如果是字符串将stack2栈顶项批改为该字符串,指针持续向后挪动d)、如果是“]” stack1栈顶数字弹出,失去须要反复的次数,起个名字叫:repeatCountstack2栈顶空字符串弹出将stack2栈顶项批改为:tack2栈顶项 + 反复repeatCount后的字符串指针持续向后挪动用一涨动图来演示 代码实现function smartRepeat(template){ let stack1 = []; // 寄存数字 let stack2 = []; // 寄存字符串 let index = 0; // 指针 let remaining = template; // 残余局部 // 这里index要小于template.length - 1,当遇到最初一个“]”的时候就不须要再出栈了,因为此时数组长度为1了,此时出栈再获取数组最初一项的值就会变成undefined while (index < template.length - 1){ if(/(^\d+)\[/.test(remaining)){ // 如果是数字。因为xxx]里的xxx数字前面肯定是“]”,如果不加上“]”,那么在匹配的时候很可能会将要循环的字符串误匹配为数字 let countStr = RegExp.$1; // RegExp.$1获取的就是/(^\d+)/这个正则中括号分组中匹配到的内容 let len = countStr.length; stack1.push(countStr * 1); stack2.push(''); index += len; remaining = remaining.substr(len); console.log('推入数字:', countStr * 1); console.log('stack1', stack1); console.log('stack2', stack2); } else if(remaining.charAt(0) == '['){ // 如果是“[” index++; remaining = remaining.substr(1); console.log('推入空字符串:'); console.log('stack1', stack1); console.log('stack2', stack2); } else if(/^(\w+)\]/.test(remaining)) { // 如果是字符串。因为[xxx]里的xxx能够是数字、字母或数字字母的组合,并且他们前面肯定是“]”,所以这里的正则须要加上“]” let chats = RegExp.$1; let stack2LastStr = stack2[stack2.length - 1]; stack2[stack2.length - 1] = stack2LastStr + chats; index += chats.length; remaining = remaining.substr(chats.length); console.log('推入字符串:', chats); console.log('stack1', stack1); console.log('stack2', stack2); } else if(remaining.charAt(0) == ']') { // 如果是“]”,需出栈 let repeatCount = stack1.pop(); let needRepeatStr = stack2.pop(); console.log('出栈,两个栈顶:', repeatCount, needRepeatStr); let resultStr = needRepeatStr.repeat(repeatCount); // 后果字符串 let stack2LastStr = stack2[stack2.length - 1]; stack2[stack2.length - 1] = stack2LastStr + resultStr; index++; remaining = remaining.substr(1); console.log('出栈,后果字符串:', resultStr, stack2LastStr); console.log('stack1', stack1); console.log('stack2', stack2); } else { index++; remaining = remaining.substr(1); } } console.log('循环实现--------------', index); console.log('stack1', stack1); console.log('stack2', stack2); let repeatCount = stack1.pop(); let needRepeatStr = stack2.pop(); let resultStr = needRepeatStr.repeat(repeatCount); // 后果字符串 console.log('最终后果字符串:', resultStr); return resultStr;}// 输入后果:abcabcsmartRepeat('2[abc]');// 输入后果:abbabbsmartRepeat('2[1[a]2[b]]');// 输入后果:abbbccccbbbccccabbbccccbbbccccsmartRepeat('2[1[a]2[3[b]4[c]]]');// 输入后果:1ab2b2b2ccccb2b2b2cccc1ab2b2b2ccccb2b2b2ccccsmartRepeat('2[1[1a]2[3[b2]4[c]]]');

October 28, 2021 · 2 min · jiezi

关于栈:LeetCode刷题日记之柱状图中的最大面积

LeetCode第84题,使用枯燥递增栈求柱状图的最大面积,这个思维还是很奇妙的,记录下解题思路。 先看下题: 给定 n 个非负整数,用来示意柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,可能勾画进去的矩形的最大面积。 示例: 输出: [2,1,5,6,2,3]输入: 10 其实我没看题解之前我是齐全懵逼,间接用暴力法求解,而后超时。前面看完题解之后才意识到既然还能用栈去解,想出这个解法的人真的对栈这种数据结构了解的太通透了。 然而当你看懂其实思路还是很简略的。 请跟着我的思路一起看下这个后果是怎么进去的,要求柱状图面积,那肯定须要晓得左右边界和高度,咱们先手动保护一个枯燥递增的栈。这个栈能有什么用呢? 它会有一个个性,当第一个小于栈顶元素呈现时,咱们能算出栈里所有比以后元素大的以栈顶元素为右边界的这个柱子的最大面积,左边界怎么算呢,就是第二个栈顶元素+1,高度就是左右边界的最小高度。值为什么能这么算呢,因为栈是递增的,如果有比第二个栈顶元素小的元素时,它肯定是被弹出去了。(这个可能有点不那么好思考,倡议多写几遍或者debug一下) 接下来看下代码: int len = heights.length;int maxArea = 0;Stack<Integer> stack = new Stack<>();//这里能等于n的起因是当i=n-1的时候栈里还会有最初一个元素,因而须要结构一个最小的n把栈里残余其余元素拿进去for (int i = 0; i <= len;) { //等于n须要非凡解决 int h = (i == len ? 0 : heights[i]); //保护一个枯燥递增栈,如果压栈元素比栈顶元素大,间接压入栈中,否则顺次将比它大的元素取出 if (stack.isEmpty() || h >= heights[stack.peek()]) { stack.push(i); i++; }else { int curHeight = heights[stack.pop()]; int rightBoundary = i - 1; int leftBoundary = stack.isEmpty() ? 0 : stack.peek() + 1; int width = rightBoundary - leftBoundary + 1; maxArea = Math.max(maxArea, (curHeight * width)); }}return maxArea;解释下这块代码,咱们一开始初始化了一个栈,和一个最大值,而后开始遍历柱子。 ...

May 19, 2021 · 2 min · jiezi

关于iot:LiteOS内核源码分析任务栈信息

摘要:LiteOS工作栈是高地址向低地址成长的递加栈,栈指针指向行将入栈的元素地位。本文分享自华为云社区《LiteOS内核源码剖析系列六 -工作及调度(2)-工作LOS_Task》,原文作者:zhushy 。 咱们介绍下LiteOS工作栈的根底概念。LiteOS工作栈是高地址向低地址成长的递加栈,栈指针指向行将入栈的元素地位。初始化后未应用过的栈空间初始化的内容为宏OS_STACK_INIT代表的数值0xCACACACA,栈顶初始化为宏OS_STACK_MAGIC_WORD代表的数值0xCCCCCCCC。一个工作栈的示意图如下,其中,栈底指针是栈的最大的内存地址,栈顶指针,是栈的最小的内存地址,栈指针从栈底向栈顶方向成长。 1、 LOS_StackInfo工作栈构造体定义typedef struct { VOID *stackTop; // 栈顶指针 UINT32 stackSize; // 栈大小 CHAR *stackName; // 栈名称} StackInfo;另外定义了一个宏函数OS_STACK_MAGIC_CHECK(topstack)用于检测栈是否无效,当栈顶等于OS_STACK_MAGIC_WORD栈是失常的,没有溢出,否则栈顶被改写,产生栈溢出。 /* 1:无效失常的栈 0:有效,产生溢出的栈 */#define OS_STACK_MAGIC_CHECK(topstack) (*(UINTPTR *)(topstack) == OS_STACK_MAGIC_WORD)2、 LOS_StackInfo工作栈反对的操作2.1 工作栈初始化栈初始化函数VOID OsStackInit()应用2个参数,一个是栈顶指针VOID *stacktop,一个是初始化的栈的大小。把栈内容初始化为OS_STACK_INIT,把栈顶初始化为OS_STACK_MAGIC_WORD。 该函数被archarmcortex_msrctask.c的OsTaskStackInit(UINT32 taskId, UINT32 stackSize, VOID topStack)办法调用,进一步被创立工作时的OsTaskCreateOnly()办法调用,实现新创建工作的工作栈初始化。 VOID OsStackInit(VOID *stacktop, UINT32 stacksize){ (VOID)memset_s(stacktop, stacksize, (INT32)OS_STACK_INIT, stacksize); *((UINTPTR *)stacktop) = OS_STACK_MAGIC_WORD;}2.2 获取工作栈水线随着工作栈入栈、出栈,以后栈应用的大小不肯定是最大值,OsStackWaterLineGet()能够获取的栈应用的最大值即水线WaterLine。 该函数须要3个参数,UINTPTR stackBottom是栈底指针,const UINTPTR stackTop栈顶指针,UINT32 *peakUsed用于返回获取的水线值,即工作栈应用的最大值。 ⑴处代码示意如果*stackTop == OS_STACK_MAGIC_WORD,阐明栈没有被溢出毁坏,从栈顶开始栈内容被写满宏OS_STACK_INIT的局部是没有应用过的栈空间。应用tmp指针变量顺次向栈底方向减少,判断栈是否被应用过,while循环完结,栈指针tmp指向最大的未应用过的栈地址。⑵处代码应用栈底指针stackBottom减去tmp,获取最大的应用过的栈空间大小,即须要的水线。⑶处如果栈顶溢出,则返回有效值OS_INVALID_WATERLINE。 该函数被kernelbaselos_task.c中的函数LOS_TaskInfoGet(UINT32 taskId, TSK_INFO_S *taskInfo)调用,获取工作的信息。在shell模块也会应用来或者栈信息。 UINT32 OsStackWaterLineGet(const UINTPTR *stackBottom, const UINTPTR *stackTop, UINT32 *peakUsed){ UINT32 size; const UINTPTR *tmp = NULL;⑴ if (*stackTop == OS_STACK_MAGIC_WORD) { tmp = stackTop + 1; while ((tmp < stackBottom) && (*tmp == OS_STACK_INIT)) { tmp++; }⑵ size = (UINT32)((UINTPTR)stackBottom - (UINTPTR)tmp); *peakUsed = (size == 0) ? size : (size + sizeof(CHAR *)); return LOS_OK; } else { *peakUsed = OS_INVALID_WATERLINE; return LOS_NOK; }}3、 LOS_Task工作栈初始化咱们以AArch32 Cortex-M核为例,分析下工作栈初始化的过程,相干代码散布在archarmcortex_mincludearchtask.h、archarmcortex_msrctask.c。首先看下工作上下文。 ...

April 1, 2021 · 3 min · jiezi

关于栈:前端面试每日-31-第583天

明天的知识点 (2020.11.19) —— 第583天 (我也要出题)[html] 应用canvas能实现哪些简单的性能?[css] 如何判断dpr的倍数?[js] 请解释下执行栈有哪些特点?[软技能] 你理解什么是无界画布吗?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

November 19, 2020 · 1 min · jiezi

关于栈:前端面试每日-31-第533天

明天的知识点 (2020.09.30) —— 第533天 (我也要出题)[html] html页面中如何实现gif图片从新播放?[css] 简述下Flex的容器和我的项目的概念[js] 函数的调用栈是怎么工作的?[软技能] 我的项目工作量的评估中,“人天”指的是什么?它有什么作用?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

September 30, 2020 · 1 min · jiezi

关于栈:一周刷完剑指offer20包含min函数的栈

蕴含min函数的栈1. 题目形容定义栈的数据结构,请在该类型中实现一个可能失去栈中所含最小元素的min函数(工夫复杂度应为O(1))。 2. 示例无 3. 解题思路思路:利用一个辅助栈来寄存最小值 栈 3,4,2,5,1辅助栈 3,3,2,2,1每入栈一次,就与辅助栈顶比拟大小,如果小就入栈,如果大就入栈以后的辅助栈顶 当出栈时,辅助栈也要出栈 这种做法能够保障辅助栈顶肯定都以后栈的最小值 4. Java实现import java.util.Stack; public class Solution { private Stack<Integer> dataStack = new Stack(); private Stack<Integer> minStack = new Stack(); public void push(int node) { dataStack.push(node); if (minStack.isEmpty() || min() > node){ // 如果为空,则之间push进去,如果最小栈的最小值都比node大,也把node值push minStack.push(node); }else{ minStack.push(min()); } } public void pop() { dataStack.pop(); minStack.pop(); } public int top() { return dataStack.peek(); } public int min() { return minStack.peek(); }}5. Python实现# -*- coding:utf-8 -*-class Solution: def __init__(self): #应用两个栈来实现,两个栈的大小是雷同的 self.stack = [] self.minStack = [] def push(self, node): # write code here self.stack.append(node) if not self.minStack or self.min() > node: # 将最小值减少到minStack中 self.minStack.append(node) else: self.minStack.append(self.min()) def pop(self): # write code here if self.stack and self.minStack: self.stack.pop() self.minStack.pop() else: return None def top(self): # write code here return self.stack[-1] def min(self): # write code here return self.minStack[-1]如果您感觉本文有用,请点个“在看” ...

September 17, 2020 · 1 min · jiezi

关于栈:栈-高温天数leetcode739

题目形容请依据每日 气温 列表,从新生成一个列表。对应地位的输入为:要想观测到更高的气温,至多须要期待的天数。如果气温在这之后都不会升高,请在该地位用 0 来代替。 例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输入应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 提醒:气温 列表长度的范畴是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范畴内的整数。 解题思路思路一:暴力破解,应用双循环,找到下一个大于以后值的序号; 思路二:1、反向开始算,最初一个必定是0; 2、而后开始排,用新数组记录对应的每个数值的下一个大于他的值的间隔 3、和下一个数值比照,联合下一个素值对应的新数组记录的下一个大于该值的地位,疾速找到下一个比照的数值的地位 ### 语言积攒和技巧 1、不必管最初一个数值的后果,应为new的时候,曾经给他赋值0了 2、在进行循环比照的时候,改良下逻辑关系,判断条件外面能够少一个比拟的操作,这样整题的运算工夫会有4ms降到3ms。具体看连贯2和连贯3的区别 ### vscode 代码连贯https://github.com/lunaDolphin/leetcode/tree/master/stack_dailyTemperatures_739https://github.com/lunaDolphin/leetcode/tree/master/stack_dailyTemperatures_739_1https://github.com/lunaDolphin/leetcode/tree/master/stack_dailyTemperatures_739_2

August 27, 2020 · 1 min · jiezi