1 概述
1.1 案例介绍
在现代软件开发中,数据结构的选择对程序的性能和可维护性有着至关重要的影响。栈和队列作为两种最基本的数据结构,分别适用于不同的场景。理解它们的特性和优劣,能够帮助开发者在实际项目中做出更合理的技术选型,从而优化系统性能。
栈是一种后进先出(LIFO)的线性结构,支持压栈(push)和弹栈(pop)操作。队列是一种先进先出(FIFO)的线性结构,支持入队(enqueue)和出队(dequeue)操作。栈适用于逆序处理的场景,队列适用于需顺序处理的场景。
本案例首先介绍栈和队列的基本概念与操作,最终使用栈和队列完成一个简单的模拟银行排队系统开发系。本案例相关实验将在华为云开发者空间云主机进行,开发者空间云主机为开发者提供了高效稳定的云资源,确保用户的数据安全。云主机当前已适配完整的C/C++开发环境,支持VS Code等多种IDE工具安装调测。
1.2 适用对象
- 个人开发者
- 高校学生
1.3 案例时间
本案例总时长预计50分钟。
1.4 案例流程

说明:
- 开通开发者空间,搭建C/C++开发环境。
- 打开VS Code,编写代码运行程序。
1.5 资源总览
本案例预计花费总计0元。
| 资源名称 | 规格 | 单价(元) | 时长(分钟) |
|---|---|---|---|
| 开发者空间-云主机 | 4vCPUs | 8GB | ARM | Ubuntu | Ubuntu 24.04 Server 定制版 | 免费 | 50 |
| VS Code | 1.97.2 | 免费 | 50 |
2 配置实验环境
2.1 开发者空间配置
面向广大开发者群体,华为开发者空间提供一个随时访问的“开发桌面云主机”、丰富的“预配置工具集合”和灵活使用的“场景化资源池”,开发者开箱即用,快速体验华为根技术和资源。
如果还没有领取开发者空间云主机,可以参考免费领取云主机文档领取。
领取云主机后可以直接进入华为开发者空间工作台界面,点击打开云主机 > 进入桌面连接云主机。


2.2 配置实验环境
参考案例中心《基于开发者空间,定制C&C++开发环境云主机镜像》“2. 实验环境搭建”、“3. VS Code安装部署”章节完成开发环境、VS Code及插件安装。

3 栈和队列
3.1 栈的基本概念与操作
后进先出(LIFO):最后入栈的元素最先出栈。
核心操作:
push():元素入栈;
pop():元素出栈;
peek():查看栈顶元素。
元素入栈:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define MAX_SIZE 100
// 栈结构
typedef struct {
int top;
int data[MAX_SIZE];
} Stack;
// 检查栈是否已满
bool isStackFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
// 入栈操作
void push(Stack *s, int value) {
if (isStackFull(s)) {
printf("栈已满,无法添加元素\n");
return;
}
s->data[++s->top] = value;
}
元素出栈:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define MAX_SIZE 100
// 栈结构
typedef struct {
int top;
int data[MAX_SIZE];
} Stack;
// 检查栈是否为空
bool isStackEmpty(Stack *s) {
return s->top == -1;
}
// 出栈操作
int pop(Stack *s) {
if (isStackEmpty(s)) {
printf("栈为空,无法弹出元素\n");
return -1;
}
return s->data[s->top--];
}
查看栈顶元素:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define MAX_SIZE 100
// 栈结构
typedef struct {
int top;
int data[MAX_SIZE];
} Stack;
// 检查栈是否为空
bool isStackEmpty(Stack *s) {
return s->top == -1;
}
// 查看栈顶元素
int peek(Stack *s) {
if (isStackEmpty(s)) {
printf("栈为空\n");
return -1;
}
return s->data[s->top];
}
栈的完整代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define MAX_SIZE 100
// 栈结构
typedef struct {
int top;
int data[MAX_SIZE];
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 检查栈是否为空
bool isStackEmpty(Stack *s) {
return s->top == -1;
}
// 检查栈是否已满
bool isStackFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
// 入栈操作
void push(Stack *s, int value) {
if (isStackFull(s)) {
printf("栈已满,无法添加元素\n");
return;
}
s->data[++s->top] = value;
}
// 出栈操作
int pop(Stack *s) {
if (isStackEmpty(s)) {
printf("栈为空,无法弹出元素\n");
return -1;
}
return s->data[s->top--];
}
// 查看栈顶元素
int peek(Stack *s) {
if (isStackEmpty(s)) {
printf("栈为空\n");
return -1;
}
return s->data[s->top];
}
// 打印栈内容
void printStack(Stack *s) {
if (isStackEmpty(s)) {
printf("栈为空\n");
return;
}
printf("栈内容 (从顶到底): ");
for (int i = s->top; i >= 0; i--) {
printf("%d ", s->data[i]);
}
printf("\n");
}
元素入栈、元素出栈、查看栈顶元素、打印栈内容,具体代码操作如下:
Step1:复制以下代码,替换main.cpp文件中的代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define MAX_SIZE 100
// 栈结构
typedef struct {
int top;
int data[MAX_SIZE];
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 检查栈是否为空
bool isStackEmpty(Stack *s) {
return s->top == -1;
}
// 检查栈是否已满
bool isStackFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
// 入栈操作
void push(Stack *s, int value) {
if (isStackFull(s)) {
printf("栈已满,无法添加元素\n");
return;
}
s->data[++s->top] = value;
}
// 出栈操作
int pop(Stack *s) {
if (isStackEmpty(s)) {
printf("栈为空,无法弹出元素\n");
return -1;
}
return s->data[s->top--];
}
// 查看栈顶元素
int peek(Stack *s) {
if (isStackEmpty(s)) {
printf("栈为空\n");
return -1;
}
return s->data[s->top];
}
// 打印栈内容
void printStack(Stack *s) {
if (isStackEmpty(s)) {
printf("栈为空\n");
return;
}
printf("栈内容 (从顶到底): ");
for (int i = s->top; i >= 0; i--) {
printf("%d ", s->data[i]);
}
printf("\n");
}
int main() {
Stack s;
// 初始化栈
initStack(&s);
// 元素入栈
push(&s, 10);
push(&s, 20);
push(&s, 30);
printStack(&s);
printf("栈顶元素: %d\n", peek(&s));
printf("元素出栈: %d\n", pop(&s));
printStack(&s);
return 0;
}
Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

3.2 栈的应用实例
括号匹配:检查表达式中的括号是否合法匹配。
实现思路:
- 遇到左括号入栈;
- 遇到右括号时弹出栈顶元素并检查是否匹配;
- 最后检查栈是否为空。
具体代码操作如下:
Step1:复制以下代码,替换main.cpp文件中的代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define MAX_SIZE 100
// 栈结构
typedef struct {
int top;
int data[MAX_SIZE];
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 检查栈是否为空
bool isStackEmpty(Stack *s) {
return s->top == -1;
}
// 检查栈是否已满
bool isStackFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
// 入栈操作
void push(Stack *s, int value) {
if (isStackFull(s)) {
printf("栈已满,无法添加元素\n");
return;
}
s->data[++s->top] = value;
}
// 出栈操作
int pop(Stack *s) {
if (isStackEmpty(s)) {
printf("栈为空,无法弹出元素\n");
return -1;
}
return s->data[s->top--];
}
// 查看栈顶元素
int peek(Stack *s) {
if (isStackEmpty(s)) {
printf("栈为空\n");
return -1;
}
return s->data[s->top];
}
// 打印栈内容
void printStack(Stack *s) {
if (isStackEmpty(s)) {
printf("栈为空\n");
return;
}
printf("栈内容 (从顶到底): ");
for (int i = s->top; i >= 0; i--) {
printf("%d ", s->data[i]);
}
printf("\n");
}
bool isBalancedParentheses(char *expression) {
Stack s;
initStack(&s);
for (int i = 0; expression[i] != '\0'; i++) {
if (expression[i] == '(' || expression[i] == '[' || expression[i] == '{') {
push(&s, expression[i]);
} else if (expression[i] == ')' || expression[i] == ']' || expression[i] == '}') {
if (isStackEmpty(&s)) {
return false;
}
char topChar = pop(&s);
if ((expression[i] == ')' && topChar != '(') ||
(expression[i] == ']' && topChar != '[') ||
(expression[i] == '}' && topChar != '{')) {
return false;
}
}
}
return isStackEmpty(&s);
}
int main() {
printf("\n=== 栈的应用:括号匹配 ===\n");
char expr1[] = "({[]})";
char expr2[] = "({[}])";
printf("表达式: %s -> %s\n", expr1, isBalancedParentheses(expr1) ? "括号匹配" : "括号不匹配");
printf("表达式: %s -> %s\n", expr2, isBalancedParentheses(expr2) ? "括号匹配" : "括号不匹配");
return 0;
}
Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

3.3 队列的基本概念与操作
先进先出(FIFO):最先入队的元素最先出队
核心操作:
enqueue():元素入队;
dequeue():元素出队;
front():查看队首元素。
元素入队:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct {
int front, rear;
int data[MAX_SIZE];
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = -1;
q->rear = -1;
}
// 检查队列是否为空
bool isQueueEmpty(Queue *q) {
return q->front == -1;
}
// 检查队列是否已满
bool isQueueFull(Queue *q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
// 入队操作
void enqueue(Queue *q, int value) {
if (isQueueFull(q)) {
printf("队列已满,无法添加元素\n");
return;
}
if (isQueueEmpty(q)) {
q->front = 0;
}
q->rear = (q->rear + 1) % MAX_SIZE;
q->data[q->rear] = value;
}
元素出队:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct {
int front, rear;
int data[MAX_SIZE];
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = -1;
q->rear = -1;
}
// 检查队列是否为空
bool isQueueEmpty(Queue *q) {
return q->front == -1;
}
// 出队操作
int dequeue(Queue *q) {
if (isQueueEmpty(q)) {
printf("队列为空,无法弹出元素\n");
return -1;
}
int value = q->data[q->front];
if (q->front == q->rear) {
// 队列只有一个元素
q->front = q->rear = -1;
} else {
q->front = (q->front + 1) % MAX_SIZE;
}
return value;
}
查看队首元素:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct {
int front, rear;
int data[MAX_SIZE];
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = -1;
q->rear = -1;
}
// 检查队列是否为空
bool isQueueEmpty(Queue *q) {
return q->front == -1;
}
// 查看队首元素
int front(Queue *q) {
if (isQueueEmpty(q)) {
printf("队列为空\n");
return -1;
}
return q->data[q->front];
}
队列的完整代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct {
int front, rear;
int data[MAX_SIZE];
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = -1;
q->rear = -1;
}
// 检查队列是否为空
bool isQueueEmpty(Queue *q) {
return q->front == -1;
}
// 检查队列是否已满
bool isQueueFull(Queue *q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
// 入队操作
void enqueue(Queue *q, int value) {
if (isQueueFull(q)) {
printf("队列已满,无法添加元素\n");
return;
}
if (isQueueEmpty(q)) {
q->front = 0;
}
q->rear = (q->rear + 1) % MAX_SIZE;
q->data[q->rear] = value;
}
// 出队操作
int dequeue(Queue *q) {
if (isQueueEmpty(q)) {
printf("队列为空,无法弹出元素\n");
return -1;
}
int value = q->data[q->front];
if (q->front == q->rear) {
// 队列只有一个元素
q->front = q->rear = -1;
} else {
q->front = (q->front + 1) % MAX_SIZE;
}
return value;
}
// 查看队首元素
int front(Queue *q) {
if (isQueueEmpty(q)) {
printf("队列为空\n");
return -1;
}
return q->data[q->front];
}
// 打印队列内容
void printQueue(Queue *q) {
if (isQueueEmpty(q)) {
printf("队列为空\n");
return;
}
printf("队列内容 (从队首到队尾): ");
int i = q->front;
do {
printf("%d ", q->data[i]);
i = (i + 1) % MAX_SIZE;
} while (i != (q->rear + 1) % MAX_SIZE);
printf("\n");
}
元素入队、元素出队、查看队首元素、打印队列内容,具体代码操作如下:
Step1:复制以下代码,替换main.cpp文件中的代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct {
int front, rear;
int data[MAX_SIZE];
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = -1;
q->rear = -1;
}
// 检查队列是否为空
bool isQueueEmpty(Queue *q) {
return q->front == -1;
}
// 检查队列是否已满
bool isQueueFull(Queue *q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
// 入队操作
void enqueue(Queue *q, int value) {
if (isQueueFull(q)) {
printf("队列已满,无法添加元素\n");
return;
}
if (isQueueEmpty(q)) {
q->front = 0;
}
q->rear = (q->rear + 1) % MAX_SIZE;
q->data[q->rear] = value;
}
// 出队操作
int dequeue(Queue *q) {
if (isQueueEmpty(q)) {
printf("队列为空,无法弹出元素\n");
return -1;
}
int value = q->data[q->front];
if (q->front == q->rear) {
// 队列只有一个元素
q->front = q->rear = -1;
} else {
q->front = (q->front + 1) % MAX_SIZE;
}
return value;
}
// 查看队首元素
int front(Queue *q) {
if (isQueueEmpty(q)) {
printf("队列为空\n");
return -1;
}
return q->data[q->front];
}
// 打印队列内容
void printQueue(Queue *q) {
if (isQueueEmpty(q)) {
printf("队列为空\n");
return;
}
printf("队列内容 (从队首到队尾): ");
int i = q->front;
do {
printf("%d ", q->data[i]);
i = (i + 1) % MAX_SIZE;
} while (i != (q->rear + 1) % MAX_SIZE);
printf("\n");
}
int main() {
Queue q;
// 初始化
initQueue(&q);
// 元素入队
enqueue(&q, 100);
enqueue(&q, 200);
enqueue(&q, 300);
printQueue(&q);
printf("队首元素: %d\n", front(&q));
printf("出队元素: %d\n", dequeue(&q));
printQueue(&q);
return 0;
}
Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

3.4 队列的应用实例
打印任务管理:模拟打印任务的排队和处理。
实现思路:
- 新任务入队;
- 打印机从队首取出任务处理;
- 处理完成后任务出队;
- 重复直到队列为空。
具体代码操作如下:
Step1:复制以下代码,替换main.cpp文件中的代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct {
int front, rear;
int data[MAX_SIZE];
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = -1;
q->rear = -1;
}
// 检查队列是否为空
bool isQueueEmpty(Queue *q) {
return q->front == -1;
}
// 检查队列是否已满
bool isQueueFull(Queue *q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
// 入队操作
void enqueue(Queue *q, int value) {
if (isQueueFull(q)) {
printf("队列已满,无法添加元素\n");
return;
}
if (isQueueEmpty(q)) {
q->front = 0;
}
q->rear = (q->rear + 1) % MAX_SIZE;
q->data[q->rear] = value;
}
// 出队操作
int dequeue(Queue *q) {
if (isQueueEmpty(q)) {
printf("队列为空,无法弹出元素\n");
return -1;
}
int value = q->data[q->front];
if (q->front == q->rear) {
// 队列只有一个元素
q->front = q->rear = -1;
} else {
q->front = (q->front + 1) % MAX_SIZE;
}
return value;
}
typedef struct {
int id;
char document[50];
int pages;
} PrintJob;
void printJobManagement() {
Queue printQueue;
initQueue(&printQueue);
int jobId = 1;
printf("\n===== 打印任务管理系统 =====\n");
// 添加打印任务
PrintJob job1 = {jobId++, "需求分析.pdf", 15};
PrintJob job2 = {jobId++, "设计文档.pdf", 28};
PrintJob job3 = {jobId++, "用户手册.pdf", 22};
enqueue(&printQueue, job1.id);
printf("添加任务: %s (ID: %d, 页数: %d)\n", job1.document, job1.id, job1.pages);
enqueue(&printQueue, job2.id);
printf("添加任务: %s (ID: %d, 页数: %d)\n", job2.document, job2.id, job2.pages);
enqueue(&printQueue, job3.id);
printf("添加任务: %s (ID: %d, 页数: %d)\n", job3.document, job3.id, job3.pages);
// 处理打印任务
while (!isQueueEmpty(&printQueue)) {
int currentJobId = dequeue(&printQueue);
PrintJob currentJob;
// 在实际应用中,我们会根据ID查找任务详情
if (currentJobId == job1.id) currentJob = job1;
else if (currentJobId == job2.id) currentJob = job2;
else currentJob = job3;
printf("\n正在打印: %s (ID: %d)\n", currentJob.document, currentJob.id);
printf("打印进度: [");
for (int i = 0; i < 20; i++) {
printf("#");
// 模拟打印耗时
for (int j = 0; j < 10000000; j++);
}
printf("] 完成!\n");
printf("已打印 %d 页\n", currentJob.pages);
}
printf("\n所有打印任务已完成!\n");
}
int main() {
// 打印任务管理
printJobManagement();
return 0;
}
Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

打印内容文本显示:
===== 打印任务管理系统 =====
添加任务: 需求分析.pdf (ID: 1, 页数: 15)
添加任务: 设计文档.pdf (ID: 2, 页数: 28)
添加任务: 用户手册.pdf (ID: 3, 页数: 22)
正在打印: 需求分析.pdf (ID: 1)
打印进度: [####################] 完成!
已打印 15 页
正在打印: 设计文档.pdf (ID: 2)
打印进度: [####################] 完成!
已打印 28 页
正在打印: 用户手册.pdf (ID: 3)
打印进度: [####################] 完成!
已打印 22 页
所有打印任务已完成!
打印内容截图:

4 综合案例:银行排队系统
4.1 数据结构选择
队列:存储排队客户(先进先出原则)
栈:记录已办理业务的客户(后进先出原则)
客户结构体:
struct Customer {
int id; // 客户编号
int arrivalTime; // 到达时间
int serviceTime; // 办理时长
};
4.2 核心功能
- 随机生成客户;
- 给客户分配随机服务时间(随机服务时长1-5个时间单位);
- 客户加入等待队列;
- 检查窗口状态,空闲窗口从队列头部获取客户;
- 服务完成后记录压入历史栈。
4.3 代码实现及验证
Step1:复制以下代码,替换main.cpp文件中的代码。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// 客户结构体
struct Customer {
int id;
int arrivalTime;
int serviceTime;
};
// 队列实现
struct Queue {
struct Customer data[MAX_SIZE];
int front, rear;
};
// 栈实现
struct Stack {
struct Customer data[MAX_SIZE];
int top;
};
// 初始化队列
void initQueue(struct Queue *q) {
q->front = q->rear = -1;
}
// 入队操作
void enqueue(struct Queue *q, struct Customer c) {
if (q->rear == MAX_SIZE - 1) {
printf("队列已满!\n");
return;
}
if (q->front == -1) q->front = 0;
q->data[++q->rear] = c;
}
// 出队操作
struct Customer dequeue(struct Queue *q) {
if (q->front == -1 || q->front > q->rear) {
printf("队列为空!\n");
exit(1);
}
return q->data[q->front++];
}
// 初始化栈
void initStack(struct Stack *s) {
s->top = -1;
}
// 入栈操作
void push(struct Stack *s, struct Customer c) {
if (s->top == MAX_SIZE - 1) {
printf("栈已满!\n");
return;
}
s->data[++s->top] = c;
}
// 模拟银行服务
void bankSimulation() {
//srand(currentTime(0)); // 初始化随机数生成器
struct Queue waitQueue; // 等待队列
struct Stack doneStack; // 已完成业务栈
initQueue(&waitQueue);
initStack(&doneStack);
int currentTime = 0;
int customerId = 1;
int windowBusy = 0; // 窗口状态(0=空闲)
int serviceEndTime = 0; // 当前业务结束时间
printf("===== 银行排队系统开始模拟 =====\n");
while (currentTime <= 20) { // 模拟20个时间单位
// 新客户到达(随机生成)
if (rand() % 5 != 0) {
struct Customer newCustomer = {
customerId++,
currentTime,
rand() % 5 + 1 // 随机服务时长1-5单位
};
printf("[时间 %d] 新客户 %d 到达\n", currentTime, newCustomer.id);
enqueue(&waitQueue, newCustomer);
}
// 检查窗口状态
if (!windowBusy && waitQueue.front <= waitQueue.rear) {
struct Customer next = dequeue(&waitQueue);
windowBusy = 1;
serviceEndTime = currentTime + next.serviceTime;
printf("[时间 %d] 开始服务客户 %d\n", currentTime, next.id);
}
// 业务办理完成
if (windowBusy && currentTime >= serviceEndTime) {
windowBusy = 0;
struct Customer completed = waitQueue.data[waitQueue.front - 1];
push(&doneStack, completed);
printf("[时间 %d] 客户 %d 办理完成\n", currentTime, completed.id);
}
currentTime++;
}
// 输出业务记录
printf("\n===== 业务办理记录(后进先出) =====\n");
while (doneStack.top >= 0) {
struct Customer c = doneStack.data[doneStack.top--];
printf("客户 %d | 到达时间: %d | 服务时长: %d\n",
c.id, c.arrivalTime, c.serviceTime);
}
}
int main() {
bankSimulation();
return 0;
}
Step2:点击编辑器左上角运行按钮直接运行,Terminal窗口可以看到打印内容。

打印内容文本显示:
===== 银行排队系统开始模拟 =====
[时间 0] 新客户 1 到达
[时间 0] 开始服务客户 1
[时间 1] 新客户 2 到达
[时间 2] 新客户 3 到达
[时间 2] 客户 1 办理完成
[时间 3] 新客户 4 到达
[时间 3] 开始服务客户 2
[时间 4] 新客户 5 到达
[时间 4] 客户 2 办理完成
[时间 5] 新客户 6 到达
[时间 5] 开始服务客户 3
[时间 6] 客户 3 办理完成
[时间 7] 新客户 7 到达
[时间 7] 开始服务客户 4
[时间 8] 新客户 8 到达
[时间 9] 新客户 9 到达
[时间 10] 新客户 10 到达
[时间 10] 客户 4 办理完成
[时间 11] 新客户 11 到达
[时间 11] 开始服务客户 5
[时间 12] 新客户 12 到达
[时间 13] 客户 5 办理完成
[时间 14] 新客户 13 到达
[时间 14] 开始服务客户 6
[时间 15] 新客户 14 到达
[时间 16] 新客户 15 到达
[时间 17] 新客户 16 到达
[时间 17] 客户 6 办理完成
[时间 18] 新客户 17 到达
[时间 18] 开始服务客户 7
[时间 19] 新客户 18 到达
[时间 20] 新客户 19 到达
===== 业务办理记录(后进先出) =====
客户 6 | 到达时间: 5 | 服务时长: 3
客户 5 | 到达时间: 4 | 服务时长: 2
客户 4 | 到达时间: 3 | 服务时长: 3
客户 3 | 到达时间: 2 | 服务时长: 1
客户 2 | 到达时间: 1 | 服务时长: 1
客户 1 | 到达时间: 0 | 服务时长: 2
打印内容截图:

至此,【栈与队列】后进先出 vs 先进先出:数据结构的排队游戏案例已全部完成。
6万+

被折叠的 条评论
为什么被折叠?



