【重拾C语言】六、批量数据组织(四)线性表—栈和队列

2024-07-30 08:50:25 浏览数 (2)

前言

本文介绍了C语言使用数组实现栈和队列,及其相关操作

六、批量数据组织——数组

6.1~3 数组基础知识

【重拾C语言】六、批量数据组织(一)数组(数组类型、声明与操作、多维数组;典例:杨辉三角、矩阵乘积、消去法)-CSDN博客

https://blog.csdn.net/m0_63834988/article/details/133580645?spm=1001.2014.3001.5502

6.4 线性表——分类与检索

【重拾C语言】六、批量数据组织(二)线性表——分类与检索(主元排序、冒泡排序、插入排序、顺序检索、对半检索)_QomolangmaH的博客-CSDN博客

https://blog.csdn.net/m0_63834988/article/details/133620693?spm=1001.2014.3001.5501

6.5~7 数组初值;字符串、字符数组、字符串数组;类型定义 typedef

【重拾C语言】六、批量数据组织(三)数组初值;字符串、字符数组、字符串数组;类型定义 typedef_QomolangmaH的博客-CSDN博客

https://blog.csdn.net/m0_63834988/article/details/133660998?spm=1001.2014.3001.5501

6.8 线性表—栈和队列

栈(Stack)和队列(Queue)是常用的线性数据结构。在C语言中,可以使用数组或链表来实现栈和队列。

6.8.1 栈(Stack)
  • 栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构。
  • 使用数组实现栈时,可以使用一个整数变量来表示栈顶指针(top),指向栈顶元素的位置。
  • 初始化栈时,将栈顶指针设置为-1,表示栈为空。
  • 入栈操作(Push)将元素添加到栈顶,栈顶指针加1。
  • 出栈操作(Pop)从栈顶移除元素,栈顶指针减1。
  • 可以使用数组来存储栈的元素。
全局变量
代码语言:javascript复制
#define MAX_SIZE 100

int stack[MAX_SIZE];
int top = -1;
  • 定义了一个常量 MAX_SIZE,它表示栈的最大容量
  • 声明了一个整型数组 stack,用于存储栈中的元素。
  • 声明了一个整型变量 top,用于表示栈顶的索引,默认值为 -1,表示栈为空。
isEmpty()

检查栈是否为空。如果栈为空,返回值为 1,否则返回值为 0。

代码语言:javascript复制
int isEmpty() {
    return top == -1;
}
isFull()

检查栈是否已满。如果栈已满,返回值为 1,否则返回值为 0。

代码语言:javascript复制
int isFull() {
    return top == MAX_SIZE - 1;
}
push()

将元素压入栈中。首先检查栈是否已满,如果已满则打印提示信息并返回,否则将 data 压入栈顶,然后将 top 值加 1。

代码语言:javascript复制
void push(int data) {
    if (isFull()) {
        printf("Stack is full. Cannot push element.n");
        return;
    }
    stack[  top] = data;
}
pop()

从栈中弹出并返回栈顶元素。首先检查栈是否为空,如果为空则打印提示信息并返回 -1,否则将栈顶元素返回,然后将 top 值减 1。

代码语言:javascript复制
int pop() {
    if (isEmpty()) {
        printf("Stack is empty. Cannot pop element.n");
        return -1;
    }
    return stack[top--];
}
测试
代码语言:javascript复制
#include <stdio.h>
#define MAX_SIZE 100

int stack[MAX_SIZE];
int top = -1;

int isEmpty() {
    return top == -1;
}

int isFull() {
    return top == MAX_SIZE - 1;
}

void push(int data) {
    if (isFull()) {
        printf("Stack is full. Cannot push element.n");
        return;
    }
    stack[  top] = data;
}

int pop() {
    if (isEmpty()) {
        printf("Stack is empty. Cannot pop element.n");
        return -1;
    }
    return stack[top--];
}

int main() {
    push(10);
    push(20);
    push(30);

    printf("Popped element: %dn", pop());
    printf("Popped element: %dn", pop());

    return 0;
}
  • 调用 push(10) 将元素 10 压入栈中。
  • 调用 push(20) 将元素 20 压入栈中。
  • 调用 push(30) 将元素 30 压入栈中。
  • 调用 pop() 弹出栈顶元素,并将其打印出来。
  • 再次调用 pop() 弹出栈顶元素,并将其打印出来。
6.8.2 队列(Queue)
  • 队列是一种先进先出(First-In-First-Out,FIFO)的数据结构。
  • 使用数组实现队列时,需要两个整数变量来表示队列的头部指针(front)和尾部指针(rear)。
  • 初始化队列时,将头部指针和尾部指针都设置为-1,表示队列为空。
  • 入队操作(Enqueue)将元素添加到队列尾部,尾部指针加1。
  • 出队操作(Dequeue)从队列头部移除元素,头部指针加1。
全局变量
代码语言:javascript复制
#define MAX_SIZE 100

int queue[MAX_SIZE];
int front = -1;
int rear = -1;
  • 定义了一个常量 MAX_SIZE,它表示队列的最大容量
  • 声明了一个整型数组 queue,用于存储队列中的元素。
  • 声明了两个整型变量 frontrear,分别表示队列的前端和后端的索引,默认值均为 -1,表示队列为空。
isEmpty()

检查队列是否为空。如果队列为空,返回值为 1,否则返回值为 0。

代码语言:javascript复制
int isEmpty() {
    return front == -1;
}
isFull()

检查队列是否已满。如果队列已满,返回值为 1,否则返回值为 0。

代码语言:javascript复制
int isFull() {
    return (rear   1) % MAX_SIZE == front;
}
enqueue()

将元素入队。首先检查队列是否已满,如果已满则打印提示信息并返回,否则根据队列的循环性质更新 rear 的值,并将 data 存储到相应位置。

代码语言:javascript复制
void enqueue(int data) {
    if (isFull()) {
        printf("Queue is full. Cannot enqueue element.n");
        return;
    }
    if (isEmpty()) {
        front = 0;
    }
    rear = (rear   1) % MAX_SIZE;
    queue[rear] = data;
}
dequeue()

用于从队列中出队并返回队首元素。首先检查队列是否为空,如果为空则打印提示信息并返回 -1,否则取出队首元素并根据队列的循环性质更新 frontrear 的值。

代码语言:javascript复制
int dequeue() {
    if (isEmpty()) {
        printf("Queue is empty. Cannot dequeue element.n");
        return -1;
    }
    int data = queue[front];
    if (front == rear) {
        front = -1;
        rear = -1;
    } else {
        front = (front   1) % MAX_SIZE;
    }
    return data;
}
测试
代码语言:javascript复制
#include <stdio.h>
#define MAX_SIZE 100

int queue[MAX_SIZE];
int front = -1;
int rear = -1;

int isEmpty() {
    return front == -1;
}

int isFull() {
    return (rear   1) % MAX_SIZE == front;
}

void enqueue(int data) {
    if (isFull()) {
        printf("Queue is full. Cannot enqueue element.n");
        return;
    }
    if (isEmpty()) {
        front = 0;
    }
    rear = (rear   1) % MAX_SIZE;
    queue[rear] = data;
}

int dequeue() {
    if (isEmpty()) {
        printf("Queue is empty. Cannot dequeue element.n");
        return -1;
    }
    int data = queue[front];
    if (front == rear) {
        front = -1;
        rear = -1;
    } else {
        front = (front   1) % MAX_SIZE;
    }
    return data;
}

int main() {
    enqueue(10);
    enqueue(20);
    enqueue(30);

    printf("Dequeued element: %dn", dequeue());
    printf("Dequeued element: %dn", dequeue());

    return 0;
}
  • 调用 enqueue(10) 将元素 10 入队。
  • 调用 enqueue(20) 将元素 20 入队。
  • 调用 enqueue(30) 将元素 30 入队。
  • 调用 dequeue() 出队并打印出队的元素。
  • 再次调用 dequeue() 出队并打印出队的元素。

0 人点赞