栈和队列OJ(面试高频题 - 看完包!!!拿捏)

目录

题目一:括号匹配问题(来源)

        题目描述

        题目思路及实现

题目二:用队列实现栈(来源)

        题目描述

        题目思路及实现

题目三:用栈实现队列(来源)

        题目描述

        题目思路及实现

题目四:设计循环队列(来源)

        题目描述

        题目思路及实现


题目一:括号匹配问题(来源)

        题目描述

        给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

        有效字符串需满足:

        1、左括号必须用相同类型的右括号闭合。

        2、左括号必须以正确的顺序闭合。

        3、每个右括号都有一个对应的相同类型的左括号。

        题目思路及实现

        该题是栈的典型应用,满足后进先出的规则(后入栈的前括号将优先与先出现的后括号相匹配)。

        遍历字符串,遇到前括号直接入栈。遇到后括号,判断该后括号与栈顶的前括号是否匹配(若此时栈为空,则字符串无效),若不匹配则字符串无效;若匹配则删除栈顶元素,继续遍历字符串,直到字符串遍历完毕。当字符串遍历完后,检测栈是否为空,若为空,则字符串有效,若不为空,说明有前括号未匹配,字符串无效。

typedef char STDataType;

typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}Stack;

//初始化栈
void StackInit(Stack* pst)
{
	assert(pst);

	pst->a = (STDataType*)malloc(sizeof(STDataType)* 4);
	pst->top = 0;
	pst->capacity = 4;
}

//销毁栈
void StackDestroy(Stack* pst)
{
	assert(pst);

	free(pst->a);
	pst->a = NULL;
	pst->top = 0;
	pst->capacity = 0;
}

//入栈
void StackPush(Stack* pst, STDataType x)
{
	assert(pst);

	if (pst->top == pst->capacity)
	{
		STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType)*pst->capacity * 2);
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		pst->a = tmp;
		pst->capacity *= 2;
	}
	pst->a[pst->top] = x;
	pst->top++;
}

//检测栈是否为空
bool StackEmpty(Stack* pst)
{
	assert(pst);

	return pst->top == 0;
}

//出栈
void StackPop(Stack* pst)
{
	assert(pst);
	assert(!StackEmpty(pst));

	pst->top--;
}

//获取栈顶元素
STDataType StackTop(Stack* pst)
{
	assert(pst);
	assert(!StackEmpty(pst));

	return pst->a[pst->top - 1];
}


/*---以上代码是栈的基本功能实现,以下代码是题解主体部分---*/

bool isValid(char * s)
{
    // 初始化一个栈st,用于存储遇到的打开的括号
    Stack st;
    StackInit(&st);

    // 创建指向当前字符的指针cur
    char* cur = s;

    // 遍历输入字符串s中的每个字符
    while(*cur)
    {
        // 如果当前字符是打开的括号
        if(*cur == '(' || *cur == '{' || *cur == '[')
        {
            // 将其压入栈中
            StackPush(&st, *cur);

            // 移动到下一个字符
            cur++;
        }

        // 否则,如果当前字符是关闭的括号
        else
        {
            // 若栈为空,则说明没有对应的打开括号与之匹配,直接返回false
            if(StackEmpty(&st))
            {
                StackDestroy(&st);
                return false;
            }

            // 获取栈顶元素(即最近进入栈内的打开括号)
            char top = StackTop(&st);

            // 检查栈顶元素与当前关闭括号是否匹配
            if((top == '(' && *cur != ')') ||
               (top == '{' && *cur != '}') ||
               (top == '[' && *cur != ']'))
            {
                // 不匹配,则返回false
                StackDestroy(&st);
                return false;
            }

            else
            {
                // 匹配成功,弹出栈顶元素(即消耗一个括号对)
                StackPop(&st);
                // 移动到下一个字符
                cur++;
            }
        }
    }

    // 遍历结束后,若栈为空,则说明所有括号都已正确匹配,返回true;否则返回false
    bool ret = StackEmpty(&st);
    StackDestroy(&st);
    return ret;
}

        此函数利用了栈这一数据结构的特性:对于任何有效的括号序列,当扫描到一个关闭括号时,栈顶的元素一定是与其相匹配的打开括号。遍历完字符串后,栈应为空,表示所有的打开括号都有相应的关闭括号与之匹配。 

题目二:用队列实现栈(来源)

        题目描述

        请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppopempty)。

        实现 MyStack 类:

        void push(int x) 将元素 x 压入栈顶。

        int pop() 移除并返回栈顶元素。

        int top() 返回栈顶元素。

        boolean empty() 如果栈是空的,返回 true ;否则,返回 false

        题目思路及实现

        使用两个队列,始终保持一个队列为空。                                                                                       当我们需要进行压栈操作时,将数据压入不为空的队列中(若两个都为空,则随便压入一个队列)。当需要进行出栈操作时,将不为空的队列中的数据导入空队列,仅留下一个数据,这时将这个数据返回并且删除即可。判断栈是否为空,即判断两个队列是否同时为空。

typedef int QDataType;
typedef struct QListNode
{
	struct QListNode* next;
	QDataType data;
}QListNode;

typedef struct Queue
{
	QListNode* head;
	QListNode* tail;
}Queue;

//初始化队列
void QueueInit(Queue* pq)
{
	assert(pq);

	pq->head = NULL;
	pq->tail = NULL;
}

//销毁队列
void QueueDestroy(Queue* pq)
{
	assert(pq);

	QListNode* cur = pq->head;
	while (cur)
	{
		QListNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = NULL;
	pq->tail = NULL;
}

//队尾入队列
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);

	QListNode* newnode = (QListNode*)malloc(sizeof(QListNode));
	if (newnode == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->head == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
}

//检测队列是否为空
bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->head == NULL;
}

//队头出队列
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = NULL;
		pq->tail = NULL;
	}
	else
	{
		QListNode* next = pq->head->next;
		free(pq->head);
		pq->head = next;
	}
}

//获取队列头部元素
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->head->data;
}

//获取队列尾部元素
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->tail->data;
}

//获取队列中有效元素个数
int QueueSize(Queue* pq)
{
	assert(pq);

	QListNode* cur = pq->head;
	int count = 0;
	while (cur)
	{
		count++;
		cur = cur->next;
	}
	return count;
}

/*---以上代码是队列的基本功能实现,以下代码是题解主体部分---*/

// 定义一个结构体MyStack,它包含两个队列q1和q2,用以模拟栈的功能
typedef struct 
{
    Queue q1; // 第一个辅助队列
    Queue q2; // 第二个辅助队列
} MyStack;

// 创建并初始化一个MyStack类型的栈对象
MyStack* myStackCreate() 
{
    MyStack* pst = (MyStack*)malloc(sizeof(MyStack)); // 分配内存空间
    QueueInit(&pst->q1); // 初始化第一个队列
    QueueInit(&pst->q2); // 初始化第二个队列

    return pst; // 返回新创建的栈对象
}

// 将整数x压入栈顶
void myStackPush(MyStack* obj, int x) 
{
    // 判断哪个队列非空,就将元素压入哪个队列
    if (!QueueEmpty(&obj->q1))
    {
        QueuePush(&obj->q1, x); // 如果q1非空,则将元素压入q1
    }
    else
    {
        QueuePush(&obj->q2, x); // 否则将元素压入q2
    }
}

// 弹出并返回栈顶元素
int myStackPop(MyStack* obj) 
{
    Queue* pEmpty = &obj->q1; // 初始化一个指向空队列的指针
    Queue* pNoEmpty = &obj->q2; // 初始化一个指向非空队列的指针

    // 如果q1非空,则交换两个指针指向的队列
    if (!QueueEmpty(&obj->q1))
    {
        pEmpty = &obj->q2;
        pNoEmpty = &obj->q1;
    }

    // 把非空队列的所有元素依次转移到空队列,保持栈的后进先出性质
    while (QueueSize(pNoEmpty) > 1)
    {
        QueuePush(pEmpty, QueueFront(pNoEmpty)); // 将非空队列的第一个元素移至空队列末尾
        QueuePop(pNoEmpty); // 删除非空队列的第一个元素
    }

    // 获取并返回非空队列的最后一个元素(即栈顶元素)
    int front = QueueFront(pNoEmpty);
    QueuePop(pNoEmpty); // 删除已获取的栈顶元素

    return front;
}

// 返回栈顶元素但不弹出
int myStackTop(MyStack* obj) 
{
    // 根据队列状态获取栈顶元素
    if (!QueueEmpty(&obj->q1))
    {
        return QueueBack(&obj->q1); // 若q1非空,则返回q1最后一个元素(栈顶元素)
    }
    else
    {
        return QueueBack(&obj->q2); // 否则返回q2最后一个元素(栈顶元素)
    }
}

// 检查栈是否为空
bool myStackEmpty(MyStack* obj) 
{
    // 若两个队列均为空,则栈为空
    return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}

// 销毁栈并释放内存
void myStackFree(MyStack* obj) 
{
    QueueDestroy(&obj->q1); // 销毁并释放q1队列资源
    QueueDestroy(&obj->q2); // 销毁并释放q2队列资源
    free(obj); // 释放栈对象本身占用的内存
}

        这段代码中,通过两个队列巧妙地实现了栈的功能。其中,压入操作总是把元素添加到非空队列的末尾,而弹出操作时,会先确保所有元素都在同一个队列内,并且按照栈的“后进先出”原则进行操作。

题目三:用栈实现队列(来源)

        题目描述

        请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

        实现 MyQueue 类:

        void push(int x) 将元素 x 推到队列的末尾

        int pop() 从队列的开头移除并返回元素

        int peek() 返回队列开头的元素

        boolean empty() 如果队列为空,返回 true ;否则,返回 false

        题目思路及实现

        使用两个栈,第一个栈只用于数据的输入,第二个栈只用于数据的输出。当需要输出数据,但第二个栈为空时,先将第一个栈中的数据一个一个导入到第二个栈,然后第二个栈再输出数据即可。

typedef int STDataType;

typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}Stack;

//初始化栈
void StackInit(Stack* pst)
{
	assert(pst);

	pst->a = (STDataType*)malloc(sizeof(STDataType)* 4);
	pst->top = 0;
	pst->capacity = 4;
}

//销毁栈
void StackDestroy(Stack* pst)
{
	assert(pst);

	free(pst->a);
	pst->a = NULL;
	pst->top = 0;
	pst->capacity = 0;
}

//入栈
void StackPush(Stack* pst, STDataType x)
{
	assert(pst);

	if (pst->top == pst->capacity)
	{
		STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType)*pst->capacity * 2);
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		pst->a = tmp;
		pst->capacity *= 2;
	}
	pst->a[pst->top] = x;
	pst->top++;
}

//检测栈是否为空
bool StackEmpty(Stack* pst)
{
	assert(pst);

	return pst->top == 0;
}

//出栈
void StackPop(Stack* pst)
{
	assert(pst);
	assert(!StackEmpty(pst));

	pst->top--;
}

//获取栈顶元素
STDataType StackTop(Stack* pst)
{
	assert(pst);
	assert(!StackEmpty(pst));

	return pst->a[pst->top - 1];
}

//获取栈中有效元素个数
int StackSize(Stack* pst)
{
	assert(pst);

	return pst->top;
}

/*---以上代码是栈的基本功能实现,以下代码是题解主体部分---*/

// 定义一个名为MyQueue的结构体,该结构体包含两个栈:pushST(用于插入元素)和popST(用于取出元素),用来模拟队列的功能
typedef struct 
{
    Stack pushST; // 用于插入元素的栈
    Stack popST;  // 用于取出元素的栈
} MyQueue;

// 创建并初始化一个MyQueue类型的队列对象
MyQueue* myQueueCreate() 
{
    MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue)); // 动态分配内存
    StackInit(&obj->pushST); // 初始化插入元素的栈
    StackInit(&obj->popST);  // 初始化取出元素的栈

    return obj; // 返回新创建的队列对象
}

// 将整数x推入队列尾部(实际操作是将其压入pushST栈顶)
void myQueuePush(MyQueue* obj, int x) 
{
    StackPush(&obj->pushST, x); // 将元素x压入pushST栈顶
}

// 查看队列头部元素但不删除
int myQueuePeek(MyQueue* obj) 
{
    // 如果popST栈为空,则将pushST栈中的所有元素依次弹出并压入popST栈
    if(StackEmpty(&obj->popST))
    {
        while(!StackEmpty(&obj->pushST))
        {
            StackPush(&obj->popST, StackTop(&obj->pushST)); // 将pushST栈顶元素移动到popST栈顶
            StackPop(&obj->pushST);                          // 弹出pushST栈顶元素
        }
    }
    // 返回popST栈顶元素(此时为队列头部元素)
    return StackTop(&obj->popST);
}

// 从队列头部弹出并返回元素
int myQueuePop(MyQueue* obj) 
{
    int top = myQueuePeek(obj); // 获取队列头部元素
    StackPop(&obj->popST);      // 弹出popST栈顶元素(队列头部元素)
    return top;                 // 返回已弹出的头部元素
}

// 判断队列是否为空
bool myQueueEmpty(MyQueue* obj) 
{
    // 当插入元素的pushST栈和取出元素的popST栈都为空时,队列为空
    return StackEmpty(&obj->pushST) && StackEmpty(&obj->popST);
}

// 销毁队列并释放内存
void myQueueFree(MyQueue* obj) 
{
    StackDestroy(&obj->pushST); // 销毁并释放pushST栈的内存
    StackDestroy(&obj->popST);  // 销毁并释放popST栈的内存
    free(obj);                  // 释放MyQueue对象本身的内存
}

        这段代码通过两个栈来模拟队列功能,当插入元素时,将元素压入pushST栈。当需要查看或删除队列头部元素时,首先确保popST栈非空,若为空则将pushST栈中的元素全部转移至popST栈,从而保证popST栈顶元素始终为队列头部元素。这样,通过两个栈的配合,可以实现队列的先进先出(FIFO)特性。 

题目四:设计循环队列(来源)

        题目描述

        设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

        循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

        你的实现应该支持如下操作:

        MyCircularQueue(k): 构造器,设置队列长度为 k 。

        Front: 从队首获取元素。如果队列为空,返回 -1 。

        Rear: 获取队尾元素。如果队列为空,返回 -1 。

        enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。

        deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。

        isEmpty(): 检查循环队列是否为空。

        isFull(): 检查循环队列是否已满。

 

        题目思路及实现

        在环形队列中,队列为空时,队头队尾指向同一个位置。当队列不为空时,队头指向插入的第一个数据,队尾指向最后一个数据的下一个位置。

        当tail+1等于front时,说明环形队列已满。

        注意:环形队列的队尾不能像常规队列中队尾一样指向最后一个数据,如果这样的话,我们将不能区别环形队列的状态是空还是满,因为此时队头和队尾都指向同一个位置。这就意味着,我们必须留出一个空间,这个空间不能存放数据,这样我们才能很好的区别环形队列的状态是空还是满。

        如果用一个数组来实现这个环形队列的话,上面这三种状态就对应于以下三种状态:

        可以看出,此时这个数组和环形完全扯不上关系,这其实很简单,我们只需注意判断两个地方:

        1.当指针指向整个数组的后方的时候,让该指针重新指向数组的第一个元素。

        2.当指针指向整个数组的前方的时候,让该指针直接指向数组最后一个有效元素的后面。

// 定义一个循环队列结构体MyCircularQueue
typedef struct 
{
    int* a;         // 存储队列元素的数组
    int k;          // 队列的最大容量
    int front;      // 队列的头部索引
    int tail;       // 队列的尾部索引
} MyCircularQueue;

// 创建一个容量为k的循环队列
MyCircularQueue* myCircularQueueCreate(int k) 
{
    MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    obj->a = (int*)malloc(sizeof(int) * (k + 1)); // 为元素数组分配内存,预留一个额外位置便于循环

    obj->front = 0;  // 初始化头部索引
    obj->tail = 0;   // 初始化尾部索引
    obj->k = k;      // 设置队列容量

    return obj;
}

// 判断循环队列是否为空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) 
{
    return obj->front == obj->tail;
}

// 判断循环队列是否已满
bool myCircularQueueIsFull(MyCircularQueue* obj) 
{
    int tailNext = obj->tail + 1; // 计算下一个可能的尾部索引
    if (tailNext == obj->k + 1) 
    {
         // 处理索引溢出,实现循环
        tailNext = 0;
    }
    return tailNext == obj->front; // 如果计算后的尾部索引等于头部索引,则队列已满
}

// 往循环队列中入队一个值
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) 
{
    if (myCircularQueueIsFull(obj)) 
    {
        return false; // 队列已满,无法入队
    } 
    else 
    {
        obj->a[obj->tail] = value; // 在尾部索引处插入元素
        obj->tail++; // 更新尾部索引

        if (obj->tail == obj->k + 1) 
        {
            obj->tail = 0; // 处理索引溢出,实现循环
        }

        return true; // 入队成功
    }
}

// 从循环队列中出队一个值
bool myCircularQueueDeQueue(MyCircularQueue* obj) 
{
    if (myCircularQueueIsEmpty(obj)) 
    {
        return false; // 队列为空,无法出队
    } 
    else 
    {
        obj->front++; // 更新头部索引

        if (obj->front == obj->k + 1) 
        {
            obj->front = 0; // 处理索引溢出,实现循环
        }

        return true; // 出队成功
    }
}

// 获取循环队列的头部元素
int myCircularQueueFront(MyCircularQueue* obj) 
{
    if (myCircularQueueIsEmpty(obj)) 
    {
        return -1; // 队列为空,无头部元素
    } 
    else 
    {
        return obj->a[obj->front]; // 返回头部索引处的元素
    }
}

// 获取循环队列的尾部元素
int myCircularQueueRear(MyCircularQueue* obj) 
{
    if (myCircularQueueIsEmpty(obj)) 
    {
        return -1; // 队列为空,无尾部元素
    } 
    else 
    {
        int tailPrev = obj->tail - 1; // 计算上一个可能的尾部索引
        if (tailPrev == -1) 
        {
             // 处理索引负值,实现循环
            tailPrev = obj->k;
        }
        return obj->a[tailPrev]; // 返回尾部索引前一个位置的元素
    }
}

// 释放循环队列所占内存
void myCircularQueueFree(MyCircularQueue* obj) 
{
    free(obj->a); // 释放元素数组内存
    free(obj);    // 释放MyCircularQueue结构体内存
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/557370.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# 窗体应用程序 Chart控件显示实时曲线

IDE: VS2019 项目模板:C# windows 窗体应用(.NET Framework) 【参考】 B站上教程C#Chart控件画折线图的使用,关于Chart控件的属性,介绍得非常详细。B站上教程C#上位机Chart控件实时曲线终极讲解,对鼠标滚轮事件等,多…

数据结构初阶-二叉树

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 二叉树 树概念和结构 树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限节点组成的一个具有层次关系的集合,把它叫做树…

在H5开发App应用程序过程中的一些常见问题

哈喽,大家好呀,淼淼又来和大家见面啦,H5开发是一种可以跨平台、跨设备、且可以在各种设备上运行,无需安装额外的应用程序。最近有许多小伙伴跟我聊到在h5开发App应用程序的过程中遇到了一些问题,今天我们就这些问题来做…

赫克Hurco触摸屏维修工控机显示屏G190EG01

美国赫克Hurco工控机控制器维修C5SH11 Hurco工控机电脑维修 主要适用范围是:石油和石油化学工业、灶矿、油田、化学工业、化纤工业、油漆工业、肥料工业、各种制造工业。石油轮和车辆、飞机、仓库、电解车间、通讯机装配车间、要求工具不生锈、抗磁的场所等。 hurc…

SQL连接查询

连接查询: 同时涉及多个表的查询称为连接查询。 SQL中连接查询的主要类型 (1) 交叉连接(广义笛卡尔积) (2) 等值连接 (3) 自身连接 (4) 内连接 (5) 外连接 1.交叉连接 使用笛卡尔积运算的连接方式 笛卡尔积运算:设A&#xff…

Java 的注释

文章目录 java 的注释共有三种形式单行注释多行注释文档注释文档注释的文档需要命令进行生成GBK 不可映射问题 与大多数的编程语言一样,Java 中的注释也不会出现在可执行程序中。 因此我们可以在源程序中根据需要添加任意多的注释,而不必担心可执行代码受…

LeetCode:203.移除链表元素

🏝1.问题描述: 🏝2.实现代码: typedef struct ListNode ListNode; struct ListNode* removeElements(struct ListNode* head, int val) {if(headNULL)return head;ListNode *NewHead,*NewTail;ListNode *pcurhead;NewHeadNewTail…

揭秘七星创客模式:如何轻松实现财富增长

亲爱的朋友们,我是微三云的周丽,一名专注于私域电商模式创新的探索者。 在当今商业社会,随着科技的飞速发展和互联网的普及,商业模式的创新和变革成为企业发展的关键。其中,七星创客模式以其独特的魅力和gao效的yun营…

这就是酷雷曼500位合作商成功的底气

你只管赚钱,其它交给总部! 敢做出这样的承诺,酷雷曼凭的就是“保姆式”的帮扶政策。酷雷曼致力于建立一个可持续良效发展的合作商运营体系,无论是落地扶持还是培训服务,全方位为合作商保驾护航! 陪跑式落…

注意力机制基本思想(一)

​🌈 个人主页:十二月的猫-CSDN博客🔥 系列专栏: 🏀《深度学习基础知识》 相关专栏: ⚽《机器学习基础知识》 🏐《机器学习项目实战》 🥎《深度学习项目实战…

超详细Web程序设计基础知识,新手设计师快收藏!

Web 程序设计是现代计算机科学的核心领域之一。它涉及到开发各种不同类型的网站和应用程序,从基本的静态页面到复杂的动态应用程序。本文将介绍 Web 程序设计的基础知识,包括 JavaScript、HTML、CSS 等方面的内容。 1、JavaScript JavaScript 是一种脚…

【Web】Dest0g3 520迎新赛 题解(全)

目录 phpdest EasyPHP SimpleRCE funny_upload EasySSTI middle PharPOP ezip NodeSoEasy Really Easy SQL&easysql EzSerial ljctr phpdest 尝试打pearcmd,但似乎没有写文件的权限 ?config-create/&file/usr/local/lib/php/pearcmd.php&a…

C++学习————第七天(初始化列表、static,友元,内部类)

今天已经是C学习第七天,希望这篇文章能够给大家带来更多的帮助,相应文章都放在C学习专栏里面。 C学习————第五天(构造函数 析构函数 拷贝构造函数)-CSDN博客 C学习————第六天 (运算符重载 const成员 取地址&…

[渗透测试学习] Monitored-HackTheBox

Monitored-HackTheBox 信息搜集 nmap扫描一下端口 nmap -sV -sC -v --min-rate 1000 10.10.11.248扫描结果如下 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u3 (protocol 2.0) 80/tcp open http Apache httpd …

阿里巴巴拍立淘API让购物更智能:图片搜索商品,信息快速呈现,个性化推荐更精准

随着互联网的不断发展,电子商务已经成为人们日常生活中不可或缺的一部分。然而,传统的文本搜索方式在购物过程中往往存在信息不匹配、效率低下等问题。为了解决这些问题,阿里巴巴推出了拍立淘API,通过图片搜索商品的方式&#xff…

graphviz使用

安装 brew install graphviz测试 https://github.com/martisak/dotnets?tabreadme-ov-file

德鲁伊参数踩坑之路

上文说到 Druid德鲁伊参数调优实战,也正因此次优化,为后续问题埋下了伏笔 背景 2024/04/16日,业务反馈某个定时统计的数据未出来,大清早排查定位是其统计任务跑批失败,下面给一段伪代码 // 无事务执行 public void …

05 JavaScript学习:语法

JavaScript 是一种动态类型的脚本语言,广泛用于网页开发和构建交互式网页。JavaScript 的语法相对简单,但功能强大,它可以在客户端执行,并与HTML和CSS一起构建交互式的网页。 JavaScript 字面量 在 JavaScript 中,字…

吴恩达机器学习笔记:第 7 周-12支持向量机(Support Vector Machines)12.4-12.6

目录 第 7 周 12、 支持向量机(Support Vector Machines)12.4 核函数 112.5 核函数 212.6 使用支持向量机 第 7 周 12、 支持向量机(Support Vector Machines) 12.4 核函数 1 回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类 问题: …

Octopus+: An RDMA-Enabled Distributed Persistent Memory File System——泛读笔记

TOS 2021 Paper 分布式元数据论文阅读笔记整理 问题 非易失性存储器(NVM)和远程直接存储器访问(RDMA)在存储和网络硬件中提供了极高的性能。然而,现有的分布式文件系统隔离了文件系统和网络层,而且分层的…