当前位置: 首页 > news >正文

栈(Stack)和队列(Queue)

栈(Stack)和队列(Queue)都是常见的数据结构,用于存储和操作一组元素。

栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构,类似于把元素堆在一起形成的一堆物体,最后添加的元素首先被取出,而最早添加的元素则最后被取出。类比于现实生活中的例子,可以想象成堆放在一起的盘子,只能从最上面取走或者放置。栈提供了两个基本的操作:

  1. 入栈(Push):将一个元素添加到栈的顶部。
  2. 出栈(Pop):从栈的顶部移除一个元素,并返回被移除的元素。

队列是一种先进先出(First-In-First-Out,FIFO)的数据结构,类似于排队等候的人群,最早添加的元素首先被取出,而最后添加的元素则最后被取出。类比于现实生活中的例子,可以想象成加入队列的人们,只有排在前面的人才能先离开队列。队列提供了两个基本的操作:

  1. 入队(Enqueue):将一个元素添加到队列的末尾。
  2. 出队(Dequeue):从队列的头部移除一个元素,并返回被移除的元素。

需要注意的是,栈和队列都是线性的数据结构,都可以使用数组或链表来实现。它们在不同场景下有着不同的应用,根据具体的需求选择合适的数据结构可以提高算法的效率。

在这里插入图片描述

当我们进一步详细介绍栈和队列时,可以从以下几个方面展开:

  1. 栈的特点和应用:

    • 栈的主要特点是后进先出(LIFO),这意味着最后添加的元素首先被访问。
    • 常见的栈的应用包括函数调用栈、表达式求值、逆波兰表达式求值、撤销操作等。
    • 栈的实现可以使用数组或链表。使用数组实现的栈称为顺序栈,使用链表实现的栈称为链式栈。
  2. 队列的特点和应用:

    • 队列的主要特点是先进先出(FIFO),这意味着最早添加的元素首先被访问。
    • 常见的队列的应用包括任务调度、消息传递、缓冲区管理等。
    • 队列的实现同样可以使用数组或链表。使用数组实现的队列称为顺序队列,使用链表实现的队列称为链式队列。
  3. 栈和队列的基本操作:

    • 入栈(Push):将一个元素添加到栈的顶部。
    • 出栈(Pop):从栈的顶部移除一个元素,并返回被移除的元素。
    • 入队(Enqueue):将一个元素添加到队列的末尾。
    • 出队(Dequeue):从队列的头部移除一个元素,并返回被移除的元素。
  4. 栈和队列的扩展操作:

    • 获取栈顶元素(Peek):返回栈顶的元素,但不对栈进行修改。
    • 判断栈是否为空(isEmpty):检查栈是否为空,即栈中是否还有元素。
    • 判断队列是否为空(isEmpty):检查队列是否为空,即队列中是否还有元素。
    • 获取队列的头部元素(Front):返回队列的头部元素,但不对队列进行修改。

通过运用栈和队列,我们可以解决很多实际问题,优化算法的效率以及简化代码的编写。需要根据具体的场景和需求选择适合的数据结构,以充分发挥它们的优势。

当进一步详细介绍栈和队列时,我们可以讨论它们的实现方式、时间复杂度以及一些常见的应用场景。

  1. 栈的实现方式:

    • 数组实现(顺序栈):使用数组来保存栈中的元素。通过一个指针指向栈顶元素,在入栈操作时,将元素添加到指针指向的位置,并将指针上移;在出栈操作时,将指针指向的元素移除,并将指针下移。
    • 链表实现(链式栈):使用链表来保存栈中的元素。通过头节点表示栈顶,在入栈操作时,在链表头部插入一个新节点;在出栈操作时,删除链表头节点。
  2. 队列的实现方式:

    • 数组实现(顺序队列):使用数组来保存队列中的元素。使用两个指针分别指向队列的头部和尾部,在入队操作时,将元素添加到尾部,并将尾指针后移;在出队操作时,取出头部元素,并将头指针后移。
    • 链表实现(链式队列):使用链表来保存队列中的元素。使用两个指针分别指向队列的头部和尾部,在入队操作时,在链表尾部插入一个新节点;在出队操作时,删除链表头节点。
  3. 时间复杂度:

    • 栈和队列的入栈、出栈、入队和出队操作的时间复杂度均为O(1),即常数时间复杂度。这是因为它们只需要对栈顶或队列头进行操作,不需要遍历整个数据结构。
    • 但当需要访问栈或队列中的所有元素时,例如遍历或搜索,时间复杂度将变为O(n),其中n是栈或队列中的元素数量。
  4. 常见应用场景:

    • 栈的应用:函数调用栈(跟踪函数调用和返回)、浏览器的前进后退功能(使用两个栈实现)、括号匹配、逆波兰表达式求值等。
    • 队列的应用:任务调度(如操作系统中的进程调度)、消息传递(如消息队列)、缓冲区管理、广度优先搜索(BFS)等。

栈和队列是基础且重要的数据结构,在算法和软件开发中有广泛的应用。了解它们的特点、实现方式和应用场景,可以帮助我们更好地理解和应用它们。

以下是使用C语言实现栈和队列的样例代码:

  1. C语言中的栈实现:
#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100typedef struct {int items[MAX_SIZE];int top;
} Stack;void initialize(Stack* stack) {stack->top = -1;
}void push(Stack* stack, int item) {if (stack->top == MAX_SIZE - 1) {printf("Stack Overflow\n");return;}stack->items[++(stack->top)] = item;
}int pop(Stack* stack) {if (stack->top == -1) {printf("Stack Underflow\n");exit(EXIT_FAILURE);}return stack->items[(stack->top)--];
}int is_empty(Stack* stack) {return stack->top == -1;
}int peek(Stack* stack) {if (stack->top == -1) {printf("Stack is empty\n");exit(EXIT_FAILURE);}return stack->items[stack->top];
}int size(Stack* stack) {return stack->top + 1;
}
  1. C语言中的队列实现:
#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100typedef struct {int items[MAX_SIZE];int front;int rear;
} Queue;void initialize(Queue* queue) {queue->front = -1;queue->rear = -1;
}void enqueue(Queue* queue, int item) {if (queue->rear == MAX_SIZE - 1) {printf("Queue is full\n");return;} if (queue->front == -1) {queue->front = 0;}queue->items[++(queue->rear)] = item;
}int dequeue(Queue* queue) {if (queue->front == -1 || queue->front > queue->rear) {printf("Queue is empty\n");exit(EXIT_FAILURE);}return queue->items[(queue->front)++];
}int is_empty(Queue* queue) {return queue->front == -1 || queue->front > queue->rear;
}int peek(Queue* queue) {if (queue->front == -1 || queue->front > queue->rear) {printf("Queue is empty\n");exit(EXIT_FAILURE);}return queue->items[queue->front];
}int size(Queue* queue) {return queue->rear - queue->front + 1;
}

使用上述C语言代码,可以创建栈和队列对象,并进行相应的操作,如入栈、出栈、入队、出队等。

请注意,在C语言中,我们需要手动处理溢出和下溢的情况,并使用初始化函数来初始化栈和队列。此外,由于数组的特性,使用数组下标来实现栈和队列的操作。

这是使用C语言实现栈和队列的另一种方法:

  1. C语言中的栈实现:
#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100typedef struct {int* items;int top;int size;
} Stack;Stack* create_stack(int size) {Stack* stack = (Stack*)malloc(sizeof(Stack));stack->items = (int*)malloc(size * sizeof(int));stack->top = -1;stack->size = size;return stack;
}void push(Stack* stack, int item) {if (stack->top == stack->size - 1) {printf("Stack Overflow\n");return;}stack->items[++(stack->top)] = item;
}int pop(Stack* stack) {if (stack->top == -1) {printf("Stack Underflow\n");exit(EXIT_FAILURE);}return stack->items[(stack->top)--];
}int is_empty(Stack* stack) {return stack->top == -1;
}int peek(Stack* stack) {if (stack->top == -1) {printf("Stack is empty\n");exit(EXIT_FAILURE);}return stack->items[stack->top];
}int size(Stack* stack) {return stack->top + 1;
}
  1. C语言中的队列实现:
#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100typedef struct {int* items;int front;int rear;int size;
} Queue;Queue* create_queue(int size) {Queue* queue = (Queue*)malloc(sizeof(Queue));queue->items = (int*)malloc(size * sizeof(int));queue->front = -1;queue->rear = -1;queue->size = size;return queue;
}void enqueue(Queue* queue, int item) {if (queue->rear == queue->size - 1) {printf("Queue is full\n");return;} if (queue->front == -1) {queue->front = 0;}queue->items[++(queue->rear)] = item;
}int dequeue(Queue* queue) {if (queue->front == -1 || queue->front > queue->rear) {printf("Queue is empty\n");exit(EXIT_FAILURE);}return queue->items[(queue->front)++];
}int is_empty(Queue* queue) {return queue->front == -1 || queue->front > queue->rear;
}int peek(Queue* queue) {if (queue->front == -1 || queue->front > queue->rear) {printf("Queue is empty\n");exit(EXIT_FAILURE);}return queue->items[queue->front];
}int size(Queue* queue) {return queue->rear - queue->front + 1;
}

这种实现方式通过动态分配内存来创建栈和队列的数组,允许在运行时指定大小,并且能够避免固定大小的限制。

其他用途

栈和队列是一种常用的数据结构,在计算机科学和编程中有广泛的应用。以下是一些使用栈和队列的常见场景和用途:

栈的应用:

  1. 函数调用:栈可以用于函数调用过程中的参数传递、返回地址保存等。
  2. 表达式求值:栈可以用于中缀表达式转换为后缀表达式,并进行表达式求值。
  3. 浏览器历史记录:栈可以用于浏览器的前进、后退功能的实现。
  4. 括号匹配:栈可以用于检查表达式中的括号是否匹配。
  5. 撤销操作:栈可以用于记忆用户的操作序列,以便撤销之前的操作。

队列的应用:

  1. 任务调度:队列可以用于任务调度,按照先来先服务的原则处理任务。
  2. 缓冲区管理:队列可以用于管理缓冲区,实现生产者-消费者模型。
  3. 广度优先搜索:队列可以用于广度优先搜索算法,用于解决图和树的遍历问题。
  4. 打印队列:队列可以用于管理打印任务的顺序,按照先到先服务的原则进行打印。
  5. 消息传递:队列可以用于消息传递和事件驱动编程中,实现消息队列和事件队列的功能。

除了上述应用,栈和队列还在其他许多领域和算法中得到应用,例如图算法、字符串处理、编译器设计等。它们是解决问题和优化算法的重要工具之一。

当然,我很乐意为您继续提供关于栈和队列的其他应用。以下是更多使用栈和队列的示例:

栈的应用:

  1. 撤销/恢复功能:栈可用于实现编辑器、图形界面应用程序等中的撤销和恢复功能,保存操作历史并逆向执行操作。
  2. 网页浏览器中的前进和后退功能:通过使用两个栈,一个用于保存已访问的网页,另一个用于保存后退访问的网页,可以实现前进和后退浏览功能。
  3. 符号表达式求解:在编译器和解释器中,栈用于解析并计算符号表达式,例如逆波兰表达式。
  4. 历史记录:栈可用于实现文本编辑器、命令行终端等应用程序中的历史记录功能。

队列的应用:

  1. 消息传递和任务处理:队列可用于实现多线程/多进程环境下的任务调度和消息传递机制,确保任务按照顺序执行。
  2. 模拟系统:队列可用于模拟和建模真实世界中的系统,如银行排队、交通流量等。
  3. 并发请求处理:在网络服务器中,队列可用于处理并发请求,避免资源竞争和请求丢失。
  4. 图像处理:队列可用于图像处理中的滤波器、卷积等操作的处理和管理。

下面是栈和队列的简单示例代码:

栈的实现:

#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100typedef struct {int stack[MAX_SIZE];int top;
} Stack;void initStack(Stack* s) {s->top = -1;
}int isEmpty(Stack* s) {return s->top == -1;
}int isFull(Stack* s) {return s->top == MAX_SIZE - 1;
}void push(Stack* s, int item) {if (isFull(s)) {printf("Stack is full. Cannot push %d.\n", item);return;}s->stack[++(s->top)] = item;
}int pop(Stack* s) {if (isEmpty(s)) {printf("Stack is empty. Cannot pop.\n");return -1;}return s->stack[(s->top)--];
}int peek(Stack* s) {if (isEmpty(s)) {printf("Stack is empty. No element to peek.\n");return -1;}return s->stack[s->top];
}

队列的实现:

#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100typedef struct {int queue[MAX_SIZE];int front;int rear;
} Queue;void initQueue(Queue* q) {q->front = -1;q->rear = -1;
}int isEmpty(Queue* q) {return q->front == -1 && q->rear == -1;
}int isFull(Queue* q) {return (q->rear + 1) % MAX_SIZE == q->front;
}void enqueue(Queue* q, int item) {if (isFull(q)) {printf("Queue is full. Cannot enqueue %d.\n", item);return;}if (isEmpty(q)) {q->front = q->rear = 0;} else {q->rear = (q->rear + 1) % MAX_SIZE;}q->queue[q->rear] = item;
}int dequeue(Queue* q) {if (isEmpty(q)) {printf("Queue is empty. Cannot dequeue.\n");return -1;}int item = q->queue[q->front];if (q->front == q->rear) {q->front = q->rear = -1;} else {q->front = (q->front + 1) % MAX_SIZE;}return item;
}int front(Queue* q) {if (isEmpty(q)) {printf("Queue is empty. No front element.\n");return -1;}return q->queue[q->front];
}

这些示例代码使用了C语言的数组来实现栈和队列。栈的实现使用了一个top指针来表示栈顶,队列的实现使用了frontrear两个指针来表示队首和队尾。

您可以使用以下代码来测试栈和队列的功能:

#include <stdio.h>int main() {// 测试栈Stack stack;initStack(&stack);push(&stack, 1);push(&stack, 2);push(&stack, 3);printf("%d\n", pop(&stack));  // 输出:3printf("%d\n", peek(&stack));  // 输出:2// 测试队列Queue queue;initQueue(&queue);enqueue(&queue, 1);enqueue(&queue, 2);enqueue(&queue, 3);printf("%d\n", dequeue(&queue));  // 输出:1printf("%d\n", front(&queue));  // 输出:2return 0;
}

栈和队列是计算机科学中常用的数据结构,它们在实际应用中有很多用途。以下是一些常见的实际应用场景:

栈的实际应用:

  1. 函数调用:栈常用于函数调用过程中的内存管理。当一个函数被调用时,函数的局部变量和参数会被压入栈中,在函数执行完毕后再从栈中弹出。
  2. 表达式求值:在编译器或计算器等应用中,栈可以用来求解表达式的值。常见的算术表达式求值算法就是基于栈来实现的,例如逆波兰表达式求值。
  3. 括号匹配:栈可以用于检测括号是否匹配。通过遍历字符串并将左括号入栈,当遇到右括号时,弹出栈顶元素并检查是否匹配。
  4. 浏览器的前进和后退:浏览器中的前进和后退功能可以使用两个栈来实现,一个栈保存前进的页面,另一个栈保存后退的页面。

队列的实际应用:

  1. 任务调度:操作系统中的任务调度通常使用队列来实现。任务按照先进先出的顺序排队,调度器从队列中选择下一个要执行的任务。
  2. 网络数据传输:在计算机网络中,队列用于缓存发送和接收的数据包。数据包按照顺序进入队列,并按照先进先出的原则进行传输。
  3. 多线程同步:在多线程编程中,队列可以用于线程间的同步和通信。一个线程将数据放入队列,另一个线程从队列中取出数据。
  4. 打印队列:打印机常常需要处理大量的打印请求,这些请求可以使用队列来进行排队,保证打印的顺序。

除了以上提到的实际应用,栈和队列还被广泛应用于图算法、深度优先搜索、广度优先搜索以及其他许多算法和数据结构的实现中。

以下是C++语言实现栈和队列的代码示例:

栈的实现:

#include <iostream>
#define MAX_SIZE 100using namespace std;class Stack {
private:int stack[MAX_SIZE];int top;
public:Stack() {top = -1;}bool isEmpty() {return top == -1;}bool isFull() {return top == MAX_SIZE - 1;}void push(int item) {if (isFull()) {cout << "Stack is full. Cannot push " << item << endl;return;}stack[++top] = item;}int pop() {if (isEmpty()) {cout << "Stack is empty. Cannot pop." << endl;return -1;}return stack[top--];}int peek() {if (isEmpty()) {cout << "Stack is empty. No element to peek." << endl;return -1;}return stack[top];}
};int main() {// 测试栈Stack stack;stack.push(1);stack.push(2);stack.push(3);cout << stack.pop() << endl;  // 输出:3cout << stack.peek() << endl;  // 输出:2return 0;
}

队列的实现:

#include <iostream>
#define MAX_SIZE 100using namespace std;class Queue {
private:int queue[MAX_SIZE];int front;int rear;
public:Queue() {front = -1;rear = -1;}bool isEmpty() {return front == -1 && rear == -1;}bool isFull() {return (rear + 1) % MAX_SIZE == front;}void enqueue(int item) {if (isFull()) {cout << "Queue is full. Cannot enqueue " << item << endl;return;}if (isEmpty()) {front = rear = 0;} else {rear = (rear + 1) % MAX_SIZE;}queue[rear] = item;}int dequeue() {if (isEmpty()) {cout << "Queue is empty. Cannot dequeue." << endl;return -1;}int item = queue[front];if (front == rear) {front = rear = -1;} else {front = (front + 1) % MAX_SIZE;}return item;}int getFront() {if (isEmpty()) {cout << "Queue is empty. No front element." << endl;return -1;}return queue[front];}
};int main() {// 测试队列Queue queue;queue.enqueue(1);queue.enqueue(2);queue.enqueue(3);cout << queue.dequeue() << endl;  // 输出:1cout << queue.getFront() << endl;  // 输出:2return 0;
}

这些示例代码使用了C++语言的类来实现栈和队列。它们包括一些常见的操作,例如入栈、出栈、获取栈顶元素、入队、出队、获取队首元素等。

您可以使用以下代码来测试栈和队列的功能:

#include <iostream>
using namespace std;int main() {// 测试栈Stack stack;stack.push(1);stack.push(2);stack.push(3);cout << stack.pop() << endl;  // 输出:3cout << stack.peek() << endl;  // 输出:2// 测试队列Queue queue;queue.enqueue(1);queue.enqueue(2);queue.enqueue(3);cout << queue.dequeue() << endl;  // 输出:1cout << queue.getFront() << endl;  // 输出:2return 0;
}

首先是栈的代码示例:

#include <iostream>
#define MAX_SIZE 100using namespace std;class Stack {
private:int stack[MAX_SIZE];int top;
public:Stack() {top = -1;}bool isEmpty() {return top == -1;}bool isFull() {return top == MAX_SIZE - 1;}void push(int item) {if (isFull()) {cout << "Stack is full. Cannot push " << item << endl;return;}stack[++top] = item;}int pop() {if (isEmpty()) {cout << "Stack is empty. Cannot pop." << endl;return -1;}return stack[top--];}int peek() {if (isEmpty()) {cout << "Stack is empty. No element to peek." << endl;return -1;}return stack[top];}
};int main() {Stack stack;stack.push(1);stack.push(2);stack.push(3);cout << stack.pop() << endl;  // 输出:3cout << stack.peek() << endl;  // 输出:2return 0;
}

上述代码实现了一个基本的栈,通过push函数将元素压入栈中,pop函数将栈顶元素弹出并返回,peek函数返回栈顶元素的值,isEmpty函数检查栈是否为空,isFull函数检查栈是否已满。

main函数中,我们创建了一个Stack对象,并依次将元素1、2、3压入栈中。然后我们使用pop函数弹出栈顶元素,并用peek函数获取新的栈顶元素。

接下来是队列的代码示例:

#include <iostream>
#define MAX_SIZE 100using namespace std;class Queue {
private:int queue[MAX_SIZE];int front;int rear;
public:Queue() {front = -1;rear = -1;}bool isEmpty() {return front == -1 && rear == -1;}bool isFull() {return (rear + 1) % MAX_SIZE == front;}void enqueue(int item) {if (isFull()) {cout << "Queue is full. Cannot enqueue " << item << endl;return;}if (isEmpty()) {front = rear = 0;} else {rear = (rear + 1) % MAX_SIZE;}queue[rear] = item;}int dequeue() {if (isEmpty()) {cout << "Queue is empty. Cannot dequeue." << endl;return -1;}int item = queue[front];if (front == rear) {front = rear = -1;} else {front = (front + 1) % MAX_SIZE;}return item;}int getFront() {if (isEmpty()) {cout << "Queue is empty. No front element." << endl;return -1;}return queue[front];}
};int main() {Queue queue;queue.enqueue(1);queue.enqueue(2);queue.enqueue(3);cout << queue.dequeue() << endl;  // 输出:1cout << queue.getFront() << endl;  // 输出:2return 0;
}

上述代码实现了一个基本的队列,通过enqueue函数将元素入队列,dequeue函数从队列中取出并返回元素,getFront函数返回队首元素的值,isEmpty函数检查队列是否为空,isFull函数检查队列是否已满。

main函数中,我们创建了一个Queue对象,并依次将元素1、2、3入队列。然后我们使用dequeue函数出队列一个元素,并用getFront函数获取新的队首元素。

相关文章:

栈(Stack)和队列(Queue)

栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;都是常见的数据结构&#xff0c;用于存储和操作一组元素。 栈是一种后进先出&#xff08;Last-In-First-Out&#xff0c;LIFO&#xff09;的数据结构&#xff0c;类似于把元素堆在一起形成的一堆物体&…...

LeetCode 75 part 06 栈

2390.从字符串中移除星号 思路&#xff1a;把元素加入栈中&#xff0c;遇到 * 号直接弹出栈顶元素 class Solution { public:string removeStars(string s) {stack<char>st;for(int i0;i<s.size();i){//字符加入栈&#xff0c;遇到星号弹出栈if(s[i]!*) st.push(s[i…...

19.组合模式(Composite)

意图&#xff1a;将对象组成树状结构以表示“部分&#xff0d;整体”的层次结构&#xff0c;使得Client对单个对象和组合对象的使用具有一致性。 上下文&#xff1a;在树型结构的问题中&#xff0c;Client必须以不同的方式处理单个对象和组合对象。能否提供一种封装&#xff0c…...

应用在IPM接口隔离领域中的光电耦合器

IPM即Intelligent Power Module(智能功率模块)的缩写&#xff0c;它是通过优化设计将IGBT连同其驱动电路和多种保护电路封装在同一模块内&#xff0c;使电力变换装置的设计者从繁琐的IGBT驱动和保护电路设计中解脱出来&#xff0c;大大降低了功率半导体器件的应用难度&#xff…...

rust引用

一、引用是什么 引用&#xff0c;又叫做借用。是一个指针类型。 引用是指向数据的指针&#xff0c;它允许我们以只读或可变的方式访问数据&#xff0c;而不获取数据的所有权。 编译器静态地保证了引用总是指向有效的对象。也就是说&#xff0c;当存在引用指向一个对象时&#…...

Android AMS——Activity Pause(八)

在前面的文章《Android AMS——ATMS解析(四)》中,介绍了 Activity 的启动流程,其中调用到 Task.resumeTopActivityInnerLocked() 时,会先调用 startPausingLocked 暂停前一个 Activity,在启动新的 Activity。 这里我们就看以下 Activity 的暂停流程。 一、Activity暂停流…...

【数据结构】冒泡排序,快速排序的学习知识总结

目录 1、冒泡排序 1.1 算法思想 1.2 代码实现 方式一&#xff1a;顺序表 方式二&#xff1a;链表 2、快速排序 2.1 算法思想 2.2 代码实现 2.3 例题分析 1、冒泡排序 1.1 算法思想 冒泡排序是一种简单的排序算法&#xff0c;它的基本思想是从数组的第一个元素开始…...

ubuntu终端 中文显示 改为 英文显示

临时有效 如果希望终端显示英文&#xff0c;可以在终端设置环境变量 export LC_ALLC 若希望取消环境变量 unset LC_ALL 实际是改变系统两个环境变量 $LANGUAGE 和 $LANG的值&#xff08;可以用echo $LANG 来查看值&#xff09; 永久有效&#xff1b; 1.打开终端&#xf…...

ChatGPT Prompting开发实战(十二)

一、如何开发prompts实现个性化的对话方式 通过设置“system”和“user”等roles&#xff0c;可以实现个性化的对话方式&#xff0c;并且可以结合参数“temperature”的设定来差异化LLM的输出内容。在此基础上&#xff0c;通过构建一个餐馆订餐对话机器人来具体演示对话过程。…...

springboot整合eureka

1、直入主题&#xff0c;导入pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:/…...

记录一个 GUI 库的对比测试结果

1&#xff0c;Java 的 JavaFX 2&#xff0c;golang 的 Fyne 1, Java 测试的是一个俄罗斯方块的 GUI 程序。一切正常。 2&#xff0c;Golang github 的原仓库网络问题&#xff0c;没能测试上&#xff0c;使用以下库 https://gitee.com/mirrors/Fyne 下载代码后提示“编译失…...

解决 MyBatis-Plus 中增加修改时,对应时间的更新问题

问题&#xff1a;在添加修改时&#xff0c;对应的 create_time 与 insert_time 不会随着添加修改而自动的更新时间 第一步&#xff1a;首先在对应的属性上&#xff0c;加上以下注解 如果只添加以下注解&#xff0c;在增加或者修改时&#xff0c;可能对应的 LocalDateTime 会出…...

【力扣2057】值相等的最小索引

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析 一、题目描述 题目链接&#xff1a;值相等的最小索引 给你一个下标从 0 开始的整数数组 nums …...

计算机图像处理:图像轮廓

图像轮廓 图像阈值分割主要是针对图片的背景和前景进行分离&#xff0c;而图像轮廓也是图像中非常重要的一个特征信息&#xff0c;通过对图像轮廓的操作&#xff0c;就能获取目标图像的大小、位置、方向等信息。画出图像轮廓的基本思路是&#xff1a;先用阈值分割划分为两类图…...

解决java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset.的错误

文章目录 1. 复现错误2. 分析错误3. 解决问题3.1 下载Hadoop3.2 配置Hadoop3.3 下载winutils3.4 配置winutils 1. 复现错误 今天在运行同事给我的项目&#xff0c;但在项目启动时&#xff0c;报出如下错误&#xff1a; java.io.FileNotFoundException: java.io.FileNotFoundEx…...

软件设计中常见的设计模式

以下是常见的设计模式&#xff0c;并且给出了应用场景&#xff1a; 工厂模式&#xff08;Factory Pattern&#xff09;&#xff1a;用于创建对象&#xff0c;隐藏了具体对象的创建细节&#xff0c;客户端只需要通过工厂接口获取对象即可。应用场景包括&#xff1a;当需要根据不…...

为什么我的remix没有injected web3

原因 Remix近期做了升级&#xff0c;去除了Web3的选项&#xff0c;您在进行部署的时候&#xff0c;可以选择injected provider metamask&#xff0c;同样能连接到Web3钱包哦。具体如下图所示&#xff1a;...

第1章 数据结构绪论

1.1 开场白 1.2 你数据结构怎么学的 1.3 数据结构起源 早期人们都把计算机理解为数值计算工具&#xff0c;就是感觉计算机当然是用来计算的&#xff0c;所以计算机解决问题&#xff0c;应该是先从具体问题中抽象出一个适当的数据模型&#xff0c;设计出一个解此数据模型的算…...

现代 GPU 容易受到新 GPU.zip 侧通道攻击

来自四所美国大学的研究人员开发了一种新的 GPU 侧通道攻击&#xff0c;该攻击利用数据压缩在访问网页时泄露现代显卡中的敏感视觉数据。 研究人员通过 Chrome 浏览器执行跨源 SVG 过滤器像素窃取攻击&#xff0c;证明了这种“ GPU.zip ”攻击的有效性。 研究人员于 2023 年 …...

8+单基因+细胞凋亡+WGCNA+单细胞+实验验证

今天给同学们分享一篇单基因细胞凋亡WGCNA实验验证的生信文章“RASGRP2 is a potential immune-related biomarker and regulates mitochondrial-dependent apoptosis in lung adenocarcinoma”&#xff0c;这篇文章于2023年2月3日发表在Front Immunol期刊上&#xff0c;影响因…...

BM4 合并两个排序的链表

思路&#xff1a;先选择最小的作为Head&#xff0c;每次从两个队列中取最小的挂到Head后面&#xff0c;如果一个合并空&#xff0c;后面直接挂。此外判断几个为空链表的情况 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullp…...

【lesson12】理解进程地址空间

文章目录 什么是进程地址空间&#xff1f;进程地址空间的作用扩展内容初步理解深入理解 什么是进程地址空间&#xff1f; 故事&#xff1a; 背景&#xff1a;有一个大富豪&#xff0c;家里的存款有10亿美元&#xff0c;他有三个私生子三个人之间彼此互不相识&#xff0c;只有富…...

计算机里的神灵(SCIP)

计算机程序的构造和解释 我找到计算机里的神灵了&#xff0c;开心一刻 下面是从MIT官网下载的 SCIP求值器&#xff08;解释器&#xff09;的代码&#xff0c;这个官网是个宝藏库 还有其他视频课程和 SCIP的问题答案和可运行代码 链接&#xff1a;https://ocw.mit.edu/courses/6…...

基于微信小程序的公交信息在线查询系统小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…...

【STM32】IAP升级01 bootloader实现以及APP配置(主要)

APP程序以及中断向量表的偏移设置 前言 通过之前的了解 之前的了解&#xff0c;我们知道实现IAP升级需要两个条件&#xff1a; 1.APP程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始&#xff1b; 2.APP程序的中断向量表相应的移动&#xff0c;移动的偏移量为 x&#xff…...

ruoyi(若依)接口拦截路径配置,接口访问要授权,放开授权直接访问

1.找到文件SecurityConfig.java文件&#xff0c;里面配置相应的放行路径...

Ctfshow web入门 XSS篇 web316-web333 详细题解 全

CTFshow XSS web316 是反射型 XSS 法一&#xff1a; 利用现成平台 法二&#xff1a; 自己搭服务器 先在服务器上面放一个接受Cookie的文件。 文件内容&#xff1a; <?php$cookie $_GET[cookie];$time date(Y-m-d h:i:s, time());$log fopen("cookie.txt"…...

watch()监听vue2项目角色权限变化更新挂载

<template><div><el-form:model"updateRole"ref"roleForm"label-width"100px"label-position"right"style"width: 400px":rules"roleRules"><el-form-item label"角色名称" prop&…...

轻量化设计、佩戴更舒适——轻律 Umelody U1头戴式蓝牙耳机

头戴式耳机不像以前那么笨重&#xff0c;身边很多人都在用&#xff0c;而且拍照还巨出片&#xff0c;拍照累了还能听歌放松&#xff0c;何乐而不为&#xff0c;国庆节即将来临&#xff0c;秋冬季节也就快要到了&#xff0c;棕色在合适不过了&#xff0c;最近有一款高颜值的复古…...

嵌入式Linux应用开发-基础知识-第三章 LED原理图-GPIO及操作

嵌入式Linux应用开发-基础知识-第三章 LED原理图-GPIO及操作 第三章 硬件知识_LED 原理图3.1 先来讲讲怎么看原理图 第四章 普适的 GPIO 引脚操作方法4.1 GPIO 模块一般结构4.2 GPIO 寄存器操作4.3 GPIO 的其他功能&#xff1a;防抖动、中断、唤醒 第五章 具体单板的 GPIO 操作…...

企业如何登录建设银行香港网站/郑州网站制作工具

2016年蓝桥杯B组C/C 点击查看2016年蓝桥杯B组省赛试题&#xff08;无答案版&#xff09; 第一题&#xff1a;煤球数目 题解 有一堆煤球&#xff0c;堆成三角棱锥形。具体&#xff1a; 第一层放1个&#xff0c; 第二层3个&#xff08;排列成三角形&#xff09;&#xff0c; 第三…...

咔咔做受视频网站/全网热度指数

Python的安装登录官网&#xff1a;www.python.org&#xff0c;选择版本3.6.4进行下载(下文中皆以MacOS为例)并安装。 PyCharm的安装登录网址&#xff1a;www.jetbrains.com&#xff0c;选择专业版进行下载并安装。 激活PyCharm时&#xff0c;在License Server中填入&#xff1a…...

wordpress主题 missoften/如何被百度收录

【CF932E】Team Work 题意&#xff1a;求$\sum\limits_{i1}^nC_n^ii^k$&#xff0c;答案模$10^97$。$n\le 10^9,k\le 5000$。 【BZOJ5093】图的价值 题意&#xff1a;“简单无向图”是指无重边、无自环的无向图&#xff08;不一定连通&#xff09;。一个带标号的图的价值定义为…...

如何找回网站后台密码/怎样免费给自己的公司做网站

给出要筛数值的范围n&#xff0c;找出以内的素数。先用2去筛&#xff0c;即把2留下&#xff0c;把2的倍数剔除掉&#xff1b;再用下一個質數&#xff0c;也就是3筛&#xff0c;把3留下&#xff0c;把3的倍数剔除掉&#xff1b;接下去用下一個質數5筛&#xff0c;把5留下&#x…...

app软件开发公司找用友yonmaker/平台优化是指什么

求递归算法时间复杂度&#xff1a;递归树1.参考资料2.内容1.参考资料 参考网页&#xff1a;求递归算法时间复杂度&#xff1a;递归树 2.内容 递归算法时间复杂度的计算方程式是一个递归方程: T(n){O(1)n1kT(n/m)f(n)n>1T(n) \left\{ \begin{array}{ll} O(1) & n1 \\…...

大连网站制作.net/全面落实疫情防控优化措施

想要在uniapp中使用echarts&#xff0c;需要进行以下操作步骤&#xff1a; 一&#xff1a;操作步骤 1.定义存放图表的div; 2.引入echarts.min,js,可以去echarts的官网“在线定制”; 3.在需要使用echarts的图表vue页面引入echarts.min.js; 4.开始使用echarts绘制图表&#xff0c…...