C语言示例代码讲解栈与队列

下面是关于“C语言示例代码讲解栈与队列”的完整攻略:

一、栈和队列的概念

栈和队列都是常用的数据结构,他们都是线性结构,但是他们在元素的插入和删除的方法以及相应的顺序限制上是有区别的。栈是一种“后进先出”的数据结构,也就是最后放入的元素最先被取出;而队列是一种“先进先出”的数据结构,也就是最先放入的元素最先被取出。

二、栈和队列的实现

1. 栈的实现

栈可以用数组或链表来实现。这里我们以数组为例,在C语言中,可以通过以下方式定义一个栈:

#define MAX_SIZE 100    // 栈的最大容量为100

typedef struct {
    int data[MAX_SIZE];
    int top;    // 栈顶指针,-1表示空
} Stack;

在定义完栈之后,我们需要实现一些基本的栈操作,例如入栈、出栈、栈空、栈满等:

// 入栈
int push(Stack *s, int value) {
    if (s->top == MAX_SIZE - 1) {
        return 0;   // 表示栈满
    } else {
        s->top++;
        s->data[s->top] = value;
        return 1;
    }
}

// 出栈
int pop(Stack *s, int *value) {
    if (s->top == -1) {
        return 0;   // 表示栈空
    } else {
        *value = s->data[s->top];
        s->top--;
        return 1;
    }
}

// 判断栈空
int is_empty(Stack *s) {
    if (s->top == -1) {
        return 1;
    } else {
        return 0;
    }
}

// 判断栈满
int is_full(Stack *s) {
    if (s->top == MAX_SIZE - 1) {
        return 1;
    } else {
        return 0;
    }
}

2. 队列的实现

队列也可以用数组或链表来实现。这里我们以数组为例,在C语言中,可以通过以下方式定义一个队列:

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

typedef struct {
    int data[MAX_SIZE];
    int front;  // 队头指针,-1表示空
    int rear;   // 队尾指针,-1表示空
} Queue;

在定义完队列之后,我们需要实现一些基本的队列操作,例如入队、出队、队空、队满等:

// 入队
int enqueue(Queue *q, int value) {
    if ((q->rear + 1) % MAX_SIZE == q->front) {
        return 0;   // 表示队满
    } else if (q->front == -1 && q->rear == -1) {
        q->front = q->rear = 0;
        q->data[q->rear] = value;
        return 1;
    } else {
        q->rear = (q->rear + 1) % MAX_SIZE;
        q->data[q->rear] = value;
        return 1;
    }
}

// 出队
int dequeue(Queue *q, int *value) {
    if (q->front == -1 && q->rear == -1) {
        return 0;   // 表示队空
    } else if (q->front == q->rear) {
        *value = q->data[q->front];
        q->front = q->rear = -1;
        return 1;
    } else {
        *value = q->data[q->front];
        q->front = (q->front + 1) % MAX_SIZE;
        return 1;
    }
}

// 判断队空
int is_empty(Queue *q) {
    if (q->front == -1 && q->rear == -1) {
        return 1;
    } else {
        return 0;
    }
}

// 判断队满
int is_full(Queue *q) {
    if ((q->rear + 1) % MAX_SIZE == q->front) {
        return 1;
    } else {
        return 0;
    }
}

三、关于栈和队列的示例

1. 判断字符串是否为回文串

回文串是指从左到右和从右到左读起来都是一样的字符串。可以用栈来判断一个字符串是否为回文串。具体的做法是,先将字符串中的每个字符依次入栈,然后再依次出栈,如果出栈的字符和原字符串相同,说明这个字符串是回文串。

#include <stdio.h>
#include <string.h>

#define MAX_SIZE 100

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

int push(Stack *s, char c) {
    if (s->top == MAX_SIZE - 1) {
        return 0;
    } else {
        s->top++;
        s->data[s->top] = c;
        return 1;
    }
}

int pop(Stack *s, char *c) {
    if (s->top == -1) {
        return 0;
    } else {
        *c = s->data[s->top];
        s->top--;
        return 1;
    }
}

int is_empty(Stack *s) {
    if (s->top == -1) {
        return 1;
    } else {
        return 0;
    }
}

int main() {
    char str[MAX_SIZE];
    Stack s = { .top = -1 };

    printf("请输入一个字符串:");
    scanf("%s", str);

    int len = strlen(str);
    for (int i = 0; i < len; i++) {
        push(&s, str[i]);
    }

    for (int i = 0; i < len; i++) {
        char c;
        pop(&s, &c);
        if (c != str[i]) {
            printf("%s不是回文串\n", str);
            return 0;
        }
    }

    printf("%s是回文串\n", str);
    return 0;
}

上面的代码通过栈的方式判断一个字符串是否为回文串。

2. 用队列实现循环移位

循环移位是指将一个长度为n的数组向右移动k个位置,移动后,数组的后k个元素出现在前面,前n-k个元素出现在后面。这个问题可以用队列来解决。

具体的做法是,首先将数组的后k个元素入队,然后把数组的前n-k个元素依次出队并入队,最后把队列中的元素依次出队并赋值给原数组。

#include <stdio.h>

#define MAX_SIZE 100

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

int enqueue(Queue *q, int value) {
    if ((q->rear + 1) % MAX_SIZE == q->front) {
        return 0;
    } else if (q->front == -1 && q->rear == -1) {
        q->front = q->rear = 0;
        q->data[q->rear] = value;
        return 1;
    } else {
        q->rear = (q->rear + 1) % MAX_SIZE;
        q->data[q->rear] = value;
        return 1;
    }
}

int dequeue(Queue *q, int *value) {
    if (q->front == -1 && q->rear == -1) {
        return 0;
    } else if (q->front == q->rear) {
        *value = q->data[q->front];
        q->front = q->rear = -1;
        return 1;
    } else {
        *value = q->data[q->front];
        q->front = (q->front + 1) % MAX_SIZE;
        return 1;
    }
}

int is_empty(Queue *q) {
    if (q->front == -1 && q->rear == -1) {
        return 1;
    } else {
        return 0;
    }
}

int main() {
    int a[MAX_SIZE], n, k;
    Queue q = { .front = -1, .rear = -1 };

    printf("请输入数组长度n和移动位数k:");
    scanf("%d%d", &n, &k);

    printf("请输入%d个整数:", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    for (int i = n - k; i < n; i++) {
        enqueue(&q, a[i]);
    }

    for (int i = 0; i < n - k; i++) {
        int value;
        dequeue(&q, &value);
        enqueue(&q, a[i]);
    }

    for (int i = 0; i < n; i++) {
        dequeue(&q, &a[i]);
    }

    printf("循环移位后的数组为:");
    for (int i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");

    return 0;
}

上面的代码通过队列的方式实现了一个长度为n的数组向右移动k个位置的功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言示例代码讲解栈与队列 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • C语言大小端字节序存储模式深入解读

    C语言大小端字节序存储模式深入解读 介绍 在计算机存储体系中,一个数据在内存中是以若干字节为单位连续存储的。对于多字节数据的存储顺序,有两种规定:大端序和小端序,又分别称为网络字节序和主机字节序。C语言内存系统的存储方式是与它所运行的机器硬件有关的。在探讨之前,首先对大小端进行简单的介绍。 机器内存中的数据,大端和小端这两种存储方式主要考虑的是字节序。在计算…

    C 2023年5月23日
    00
  • C++算法之海量数据处理方法的总结分析

    C++算法之海量数据处理方法的总结分析 1.前言 在现在这个大数据时代,我们经常需要处理海量数据。在日常编程工作中,会遇到需要处理海量数据的情况。如何高效地处理海量数据一直是程序员所关注的一个难点。下面我将总结几种海量数据处理方法并进行分析。 2.海量数据分割法 问题 海量数据的处理会导致内存溢出,因此,需要对海量数据进行分割,分割后每个部分逐一处理。 示例…

    C 2023年5月22日
    00
  • C/C++深入讲解内存管理

    C/C++深入讲解内存管理攻略 本篇攻略将会详细介绍C/C++中的内存管理,包括内存的分配和释放方式、内存泄漏与野指针等常见问题的解决方案,以及内存管理相关的工具和技巧。以下为详细介绍。 一、动态内存分配 C/C++中的动态内存分配主要通过malloc、realloc和calloc等函数来实现。其中,malloc和realloc都是只分配内存,而calloc…

    C 2023年5月23日
    00
  • 基于Java实现Json文件转换为Excel文件

    基于Java实现Json文件转换为Excel文件的攻略: 引入相关依赖 在pom.xml文件中添加以下依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.…

    C 2023年5月23日
    00
  • C语言如何计算字符串长度

    计算字符串长度是一种常见的字符串操作。在C语言中,字符串是以null字符 (‘\0’) 作为结束符的字符数组,因此计算字符串长度可以通过统计数组中的字符数来实现。下面是计算字符串长度的完整攻略: 方法一:使用标准库函数strlen() C语言标准库提供了一个函数strlen(),它可以非常方便地计算字符串的长度。该函数的定义如下: size_t strlen…

    C 2023年5月23日
    00
  • C语言实现天气信息管理系统

    C语言实现天气信息管理系统攻略 系统需求 天气信息管理系统需要实现以下功能: 添加城市天气信息 显示城市天气信息 修改城市天气信息 删除城市天气信息 保存天气信息到文件 从文件中读取天气信息 实现步骤 步骤一:定义结构体 首先,需要定义一个结构体来存储城市天气信息。 typedef struct { char city[20]; int max_temper…

    C 2023年5月23日
    00
  • C语言调试手段:锁定错误的实现方法

    当我们编写C语言程序时,难免会出现各种错误。这时候,调试就是必不可少的工作。但是,要想顺利地调试程序,我们需要掌握一些调试手段。下面,我将详细讲解“C语言调试手段:锁定错误的实现方法”的完整攻略。 一、使用调试器 调试器是一种通过逐行执行程序并观察程序运行状态来找出程序中的错误的工具。使用调试器进行调试的时候,我们可以逐行执行程序,并且在程序运行的过程中查看…

    C 2023年5月24日
    00
  • c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)

    C#几种数据库的大数据批量插入 在C#开发中,我们经常需要将大量数据批量插入到数据库中。本攻略将讲解如何在C#中实现SqlServer、Oracle、SQLite和MySql几种数据库的大数据批量插入。 SqlServer 使用SqlBulkCopy可以实现大数据批量插入到SqlServer中。具体步骤如下: 创建SqlBulkCopy对象并设置目标表名和连…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部