栈与队列的模拟实现解析

栈的模拟实现

栈是一种后进先出(LIFO)的数据结构,核心操作包括压栈(push)、弹栈(pop)和查看栈顶元素(peek)。可以通过数组或链表实现。

数组实现栈
定义一个固定大小的数组存储元素,同时维护一个栈顶指针(通常为整型变量)。压栈时将元素放入数组并移动指针,弹栈时返回栈顶元素并移动指针。

#define MAX_SIZE 100

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

void push(Stack *s, int value) {
    if (s->top < MAX_SIZE) {
        s->data[s->top++] = value;
    }
}

int pop(Stack *s) {
    if (s->top > 0) {
        return s->data[--s->top];
    }
    return -1; // 栈空标志
}

链表实现栈
使用单链表,每次压栈在链表头部插入节点,弹栈时删除头节点。无需预设容量限制。

typedef struct Node {
    int data;
    struct Node *next;
} Node;

typedef struct {
    Node *top;
} Stack;

void push(Stack *s, int value) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = value;
    newNode->next = s->top;
    s->top = newNode;
}

int pop(Stack *s) {
    if (s->top != NULL) {
        Node *temp = s->top;
        int value = temp->data;
        s->top = temp->next;
        free(temp);
        return value;
    }
    return -1;
}

队列的模拟实现

队列是先进先出(FIFO)的数据结构,核心操作包括入队(enqueue)、出队(dequeue)和查看队首元素(front)。同样可通过数组或链表实现。

数组实现循环队列
使用固定大小的数组和两个指针(front和rear)模拟循环队列。入队时移动rear指针,出队时移动front指针,利用取模运算处理边界。

#define QUEUE_SIZE 100

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

void enqueue(Queue *q, int value) {
    if ((q->rear + 1) % QUEUE_SIZE != q->front) {
        q->data[q->rear] = value;
        q->rear = (q->rear + 1) % QUEUE_SIZE;
    }
}

int dequeue(Queue *q) {
    if (q->front != q->rear) {
        int value = q->data[q->front];
        q->front = (q->front + 1) % QUEUE_SIZE;
        return value;
    }
    return -1; // 队空标志
}

链表实现队列
使用带头尾指针的单链表。入队在尾部插入节点,出队从头部删除节点。动态内存分配避免空间浪费。

typedef struct QNode {
    int data;
    struct QNode *next;
} QNode;

typedef struct {
    QNode *front, *rear;
} Queue;

void enqueue(Queue *q, int value) {
    QNode *newNode = (QNode *)malloc(sizeof(QNode));
    newNode->data = value;
    newNode->next = NULL;
    if (q->rear == NULL) {
        q->front = q->rear = newNode;
    } else {
        q->rear->next = newNode;
        q->rear = newNode;
    }
}

int dequeue(Queue *q) {
    if (q->front != NULL) {
        QNode *temp = q->front;
        int value = temp->data;
        q->front = temp->next;
        if (q->front == NULL) q->rear = NULL;
        free(temp);
        return value;
    }
    return -1;
}

复杂度分析


  • 数组和链表实现的压栈、弹栈操作均为 $O(1)$ 时间复杂度。数组实现有固定容量限制,链表实现空间更灵活但需处理动态内存。

  • 队列
    循环队列的入队出队为 $O(1)$,链表实现同样为 $O(1)$。循环队列需处理满队条件,链表实现需维护头尾指针。

应用场景对比


  • 函数调用栈、表达式求值(如括号匹配)、回溯算法(如DFS)。

  • 队列
    任务调度(如CPU轮转)、缓冲区管理(如打印队列)、广度优先搜索(BFS)。

通过模拟实现可深入理解两种结构的差异:栈的LIFO特性适合反向处理,队列的FIFO特性适合顺序调度。实际开发中可根据需求选择底层实现方式。

BbS.okapop143.sbs/PoSt/1122_266617.HtM
BbS.okapop144.sbs/PoSt/1122_654047.HtM
BbS.okapop145.sbs/PoSt/1122_384502.HtM
BbS.okapop146.sbs/PoSt/1122_726461.HtM
BbS.okapop147.sbs/PoSt/1122_684578.HtM
BbS.okapop148.sbs/PoSt/1122_258900.HtM
BbS.okapop149.sbs/PoSt/1122_581425.HtM
BbS.okapop150.sbs/PoSt/1122_926741.HtM
BbS.okapop151.sbs/PoSt/1122_710414.HtM
BbS.okapop152.sbs/PoSt/1122_051612.HtM
BbS.okapop143.sbs/PoSt/1122_758432.HtM
BbS.okapop144.sbs/PoSt/1122_645907.HtM
BbS.okapop145.sbs/PoSt/1122_082244.HtM
BbS.okapop146.sbs/PoSt/1122_304308.HtM
BbS.okapop147.sbs/PoSt/1122_247937.HtM
BbS.okapop148.sbs/PoSt/1122_221884.HtM
BbS.okapop149.sbs/PoSt/1122_321071.HtM
BbS.okapop150.sbs/PoSt/1122_642692.HtM
BbS.okapop151.sbs/PoSt/1122_250997.HtM
BbS.okapop152.sbs/PoSt/1122_134163.HtM
BbS.okapop143.sbs/PoSt/1122_445395.HtM
BbS.okapop144.sbs/PoSt/1122_936105.HtM
BbS.okapop145.sbs/PoSt/1122_347915.HtM
BbS.okapop146.sbs/PoSt/1122_068510.HtM
BbS.okapop147.sbs/PoSt/1122_340339.HtM
BbS.okapop148.sbs/PoSt/1122_516119.HtM
BbS.okapop149.sbs/PoSt/1122_539894.HtM
BbS.okapop150.sbs/PoSt/1122_549390.HtM
BbS.okapop151.sbs/PoSt/1122_056643.HtM
BbS.okapop152.sbs/PoSt/1122_400900.HtM
BbS.okapop143.sbs/PoSt/1122_447740.HtM
BbS.okapop144.sbs/PoSt/1122_223190.HtM
BbS.okapop145.sbs/PoSt/1122_775139.HtM
BbS.okapop146.sbs/PoSt/1122_511108.HtM
BbS.okapop147.sbs/PoSt/1122_969727.HtM
BbS.okapop148.sbs/PoSt/1122_343185.HtM
BbS.okapop149.sbs/PoSt/1122_045072.HtM
BbS.okapop150.sbs/PoSt/1122_457892.HtM
BbS.okapop151.sbs/PoSt/1122_450205.HtM
BbS.okapop152.sbs/PoSt/1122_269589.HtM
BbS.okapop143.sbs/PoSt/1122_068780.HtM
BbS.okapop144.sbs/PoSt/1122_938879.HtM
BbS.okapop145.sbs/PoSt/1122_161392.HtM
BbS.okapop146.sbs/PoSt/1122_193638.HtM
BbS.okapop147.sbs/PoSt/1122_789888.HtM
BbS.okapop148.sbs/PoSt/1122_560927.HtM
BbS.okapop149.sbs/PoSt/1122_487816.HtM
BbS.okapop150.sbs/PoSt/1122_079540.HtM
BbS.okapop151.sbs/PoSt/1122_924667.HtM
BbS.okapop152.sbs/PoSt/1122_031766.HtM
BbS.okapop143.sbs/PoSt/1122_782498.HtM
BbS.okapop144.sbs/PoSt/1122_789994.HtM
BbS.okapop145.sbs/PoSt/1122_727463.HtM
BbS.okapop146.sbs/PoSt/1122_384914.HtM
BbS.okapop147.sbs/PoSt/1122_727435.HtM
BbS.okapop148.sbs/PoSt/1122_791453.HtM
BbS.okapop149.sbs/PoSt/1122_789631.HtM
BbS.okapop150.sbs/PoSt/1122_998382.HtM
BbS.okapop151.sbs/PoSt/1122_509288.HtM
BbS.okapop152.sbs/PoSt/1122_873208.HtM
BbS.okapop153.sbs/PoSt/1122_990615.HtM
BbS.okapop154.sbs/PoSt/1122_412982.HtM
BbS.okapop155.sbs/PoSt/1122_801977.HtM
BbS.okapop156.sbs/PoSt/1122_066119.HtM
BbS.okapop157.sbs/PoSt/1122_314467.HtM
BbS.okapop158.sbs/PoSt/1122_513489.HtM
BbS.okapop159.sbs/PoSt/1122_810532.HtM
BbS.okapop160.sbs/PoSt/1122_167258.HtM
BbS.okapop161.sbs/PoSt/1122_416693.HtM
BbS.okapop162.sbs/PoSt/1122_012231.HtM
BbS.okapop153.sbs/PoSt/1122_416939.HtM
BbS.okapop154.sbs/PoSt/1122_577201.HtM
BbS.okapop155.sbs/PoSt/1122_082156.HtM
BbS.okapop156.sbs/PoSt/1122_720034.HtM
BbS.okapop157.sbs/PoSt/1122_528138.HtM
BbS.okapop158.sbs/PoSt/1122_893193.HtM
BbS.okapop159.sbs/PoSt/1122_275058.HtM
BbS.okapop160.sbs/PoSt/1122_919490.HtM
BbS.okapop161.sbs/PoSt/1122_413937.HtM
BbS.okapop162.sbs/PoSt/1122_566729.HtM

#牛客AI配图神器#

全部评论

相关推荐

09-25 00:00
已编辑
电子科技大学 Java
球球与墩墩:这不是前端常考的对象扁平化吗,面试官像是前端出来的 const flattern = (obj) => { const res = {}; const dfs = (curr, path) => { if(typeof curr === 'object' && curr !== null) { const isArray = Array.isArray(curr); for(let key in curr) { const newPath = path ? isArray ? `${path}[${key}]` : `${path}.${key}` : key; dfs(curr[key], newPath); } } else { res[path] = curr } } dfs(obj); return res; }
查看3道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务