举例说明栈和队列的具体实现方式c语言代码

63 阅读2分钟

栈(Stack)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MAX_SIZE 100 // 定义栈的最大容量

typedef struct {
    int top; // 栈顶指针
    int data[MAX_SIZE]; // 存储数据的数组
} Stack;

// 初始化栈
void initStack(Stack *s) {
    s->top = -1;
}

// 判断栈是否为空
bool isEmpty(Stack *s) {
    return s->top == -1;
}

// 入栈
bool push(Stack *s, int item) {
    if (s->top >= MAX_SIZE - 1) { // 栈满,不能添加新元素
        return false;
    }
    s->data[++s->top] = item; // 先移动指针,再添加元素
    return true;
}

// 出栈
bool pop(Stack *s, int *item) {
    if (isEmpty(s)) { // 栈空,不能删除元素
        return false;
    }
    *item = s->data[s->top--]; // 先获取元素,再移动指针
    return true;
}

// 查看栈顶元素
bool peek(Stack *s, int *item) {
    if (isEmpty(s)) { // 栈空,无法查看栈顶元素
        return false;
    }
    *item = s->data[s->top];
    return true;
}

int main() {
    Stack s;
    initStack(&s);
    push(&s, 1);
    push(&s, 2);
    push(&s, 3);
    int topItem;
    peek(&s, &topItem);
    printf("栈顶元素是: %d\n", topItem);
    int poppedItem;
    pop(&s, &poppedItem);
    printf("出栈的元素是: %d\n", poppedItem);
    return 0;
}

队列(Queue)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MAX_SIZE 100 // 定义队列的最大容量

typedef struct {
    int front; // 队头指针
    int rear; // 队尾指针
    int data[MAX_SIZE]; // 存储数据的数组
} Queue;

// 初始化队列
void initQueue(Queue *q) {
    q->front = 0;
    q->rear = -1;
}

// 判断队列是否为空
bool isEmpty(Queue *q) {
    return q->front > q->rear;
}

// 判断队列是否已满
bool isFull(Queue *q) {
    return (q->rear + 1) % MAX_SIZE == q->front;
}

// 入队
bool enqueue(Queue *q, int item) {
    if (isFull(q)) { // 队列满,不能添加新元素
        return false;
    }
    q->data[++q->rear] = item; // 先移动指针,再添加元素
    q->rear %= MAX_SIZE; // 循环队列,处理数组越界问题
    return true;
}

// 出队
bool dequeue(Queue *q, int *item) {
    if (isEmpty(q)) { // 队列空,不能删除元素
        return false;
    }
    *item = q->data[q->front++]; // 先获取元素,再移动指针
    q->front %= MAX_SIZE; // 循环队列,处理数组越界问题
    return true;
}

// 查看队头元素
bool peek(Queue *q, int *item) {
    if (isEmpty(q)) { // 队列空,无法查看队头元素
        return false;
    }
    *item = q->data[q->front];
    return true;
}

int main() {
    Queue q;
    initQueue(&q);
    enqueue(&q, 1);
    enqueue(&q, 2);
    enqueue(&q, 3);
    int frontItem;
    peek(&q, &frontItem);
    printf("队头元素是: %d\n", frontItem);
    int dequeuedItem;
    dequeue(&q, &dequeuedItem);
    printf("出队的元素是: %d\n", dequeuedItem);
    return 0;
}