数据结与算法4——栈和队列

1.栈

        栈是一种后进先出(LIFO, Last In First Out)的数据结构,意味着最后加入的元素将是第一个被移除的元素。栈的基本操作包括:

  • Push:在栈顶添加一个元素。
  • Pop:从栈顶移除一个元素。
  • Top:查看栈顶元素但不移除。
  • isEmpty:检查栈是否为空。
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int top;
} Stack;

void StackInit(Stack *s) {
    s->top = -1;
}

int StackPush(Stack *s, int data) {
    if (s->top >= MAX_SIZE - 1) {
        return 0; // 栈满
    }
    s->data[++s->top] = data;
    return 1;
}

int StackPop(Stack *s, int *data) {
    if (s->top < 0) {
        return 0; // 栈空
    }
    *data = s->data[s->top--];
    return 1;
}

int StackTop(Stack *s, int *data) {
    if (s->top < 0) {
        return 0; // 栈空
    }
    *data = s->data[s->top];
    return 1;
}

int StackIsEmpty(Stack *s) {
    return s->top == -1;
}

// 主函数中测试栈的实现
int main() {
    Stack s;
    int data;
    StackInit(&s);
    StackPush(&s, 1);
    StackPush(&s, 2);
    StackPush(&s, 3);
    
    if (StackTop(&s, &data)) {
        printf("Top element is: %d\n", data);
    }
    
    StackPop(&s, &data);
    printf("Popped element is: %d\n", data);
    
    if (StackIsEmpty(&s)) {
        printf("Stack is empty.\n");
    } else {
        printf("Stack is not empty.\n");
    }
    
    return 0;
}

2.队列

        队列是一种先进先出(FIFO, First In First Out)的数据结构,意味着最早加入的元素将是第一个被移除的元素。队列的基本操作包括:

  • Enqueue:在队尾添加一个元素。
  • Dequeue:从队首移除一个元素。
  • Front:查看队首元素但不移除。
  • isEmpty:检查队列是否为空。
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int front;
    int rear;
} Queue;

void QueueInit(Queue *q) {
    q->front = q->rear = 0;
}

int QueueEnqueue(Queue *q, int data) {
    if ((q->rear + 1) % MAX_SIZE == q->front) {
        return 0; // 队列满
    }
    q->data[q->rear] = data;
    q->rear = (q->rear + 1) % MAX_SIZE;
    return 1;
}

int QueueDequeue(Queue *q, int *data) {
    if (q->front == q->rear) {
        return 0; // 队列空
    }
    *data = q->data[q->front];
    q->front = (q->front + 1) % MAX_SIZE;
    return 1;
}

int QueueFront(Queue *q, int *data) {
    if (q->front == q->rear) {
        return 0; // 队列空
    }
    *data = q->data[q->front];
    return 1;
}

int QueueIsEmpty(Queue *q) {
    return q->front == q->rear;
}

// 主函数中测试队列的实现
int main() {
    Queue q;
    int data;
    QueueInit(&q);
    QueueEnqueue(&q, 1);
    QueueEnqueue(&q, 2);
    QueueEnqueue(&q, 3);
    
    if (QueueFront(&q, &data)) {
        printf("Front element is: %d\n", data);
    }
    
    QueueDequeue(&q, &data);
    printf("Dequeued element is: %d\n", data);
    
    if (QueueIsEmpty(&q)) {
        printf("Queue is empty.\n");
    } else {
        printf("Queue is not empty.\n");
    }
    
    return 0;
}

3.栈和队列实际应用场景

栈:

  1. 函数调用:在程序执行过程中,每当一个函数被调用时,系统会将其参数、局部变量和返回地址压入一个隐式的“调用栈”中。当函数返回时,这些信息被弹出栈。

  2. 表达式求值:在计算数学表达式的值时,栈可以用来反转表达式中的数字和运算符,或者在解析括号表达式时临时存储未计算的部分。

  3. 回溯算法:在解决如八皇后问题、迷宫求解等需要回溯的问题时,可以使用栈来存储中间状态,以便在确定某条路径不可行时回退到上一个状态。

  4. 深度优先搜索(DFS):在图算法中,DFS通常使用栈来实现,它允许我们沿着图的深度进行探索。

  5. 撤销操作:在文本编辑器或绘图软件中,栈可以用来实现撤销功能,每次操作都被压入栈中,撤销时则从栈顶弹出操作。

  6. 平衡符号:在编程语言的解析器中,栈用于检查字符串中的括号、尖括号等是否平衡。

队列

  1. 任务调度:在操作系统中,队列用于调度进程或线程的执行,通常按照到达顺序进行。

  2. 消息队列:在分布式系统或多线程应用中,队列常用于在不同服务或线程间传递消息。

  3. 广度优先搜索(BFS):在图算法中,BFS通常使用队列来实现,它允许我们逐层遍历图。

  4. 打印机队列:在打印机管理中,打印任务按照到达的顺序排队,先到的任务先打印。

  5. 请求处理:在网络服务器中,队列可以用来管理并发请求,确保它们按照接收的顺序被处理。

  6. 缓存实现:在某些缓存系统中,队列可以用来实现先进先出(FIFO)的淘汰策略。

  7. 模拟现实世界中的排队:如超市结账、银行窗口服务等场景,可以用队列来模拟顾客的到达和服务过程。

4.后续

        栈和队列作为基础数据结构,理解它们的原理和实现对于深入学习数据结构与算法至关重要。通过本文的介绍和代码示例,读者应该能够对栈和队列有一个基本的了解,并能够在实际编程中加以应用。在后续的文章中,我将继续探讨更复杂的数据结构,如树和图的实现逻辑。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值