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日

相关文章

  • 基于Json序列化和反序列化通用的封装完整代码

    首先我们需要了解Json序列化和反序列化的概念。Json是一种轻量级的数据交换格式,可以用于不同语言之间的数据传递,使得不同语言的程序可以相互通信。而序列化指的是将一个对象转化为Json格式字符串的过程,而反序列化则是将Json格式字符串转换为对应的对象。在实现封装代码时需要使用到Json序列化和反序列化。 基于Json序列化和反序列化通用的封装完整代码的思…

    C 2023年5月23日
    00
  • C++之CWnd窗口框架实例

    下面详细讲解一下“C++之CWnd窗口框架实例”的完整攻略。 C++之CWnd窗口框架实例 简介 CWnd是MFC框架中的一个基类,用于创建窗口。它具有以下特点: 可以接收和处理系统消息,如鼠标消息、键盘消息等; 可以在上面绘制图形; 可以在其上创建子控件等; 创建窗口 创建CWnd窗口的方法如下: BOOL CWnd::Create( LPCTSTR lp…

    C 2023年5月24日
    00
  • C语言实现猜数字小游戏

    以下是详细讲解“C语言实现猜数字小游戏”的完整攻略。 第一步:获取用户输入的数字 为实现猜数字小游戏的基本功能,首先需要获取用户输入的数字。可以使用C语言的标准库函数scanf()来实现。示例代码如下: int guess_num; // 定义变量来存储用户输入的数字 printf("请猜一个数字:"); scanf("%d&q…

    C 2023年5月23日
    00
  • C语言实现简单的五子棋小游戏

    C语言实现简单的五子棋小游戏攻略 简介 五子棋是一种非常经典的棋类游戏,通常被用于考察人工智能算法。这个项目将介绍如何通过C语言实现一个简单的五子棋小游戏。 实现思路 五子棋的实现思路比较简单。我们需要一个二维的棋盘数组来记录当前局面,也需要一些变量来记录当前是谁下棋以及游戏是否结束等等。在实现过程中需要用到以下模块: 棋盘数组: 用于记录棋盘上每个位置的棋…

    C 2023年5月23日
    00
  • 深入理解C语言内存对齐

    深入理解C语言内存对齐 1. 概述 内存对齐是C语言中的一个重要概念。在C语言中,变量的地址是按照一定的规则分配的,变量的大小和类型都会影响内存的分配。因此,我们需要了解C语言内存对齐的原理以及规则。 2. 原理 C语言内存对齐的原理是为了提高存储器访问效率。由于计算机访问内存的速度较慢,为了使CPU能够尽快地访问数据,需要进行内存对齐。内存对齐的目的是使数…

    C 2023年5月23日
    00
  • C++ 中实现把EXCEL的数据导入数据库(ACCESS、MSSQL等)实例代码

    导入 Excel 数据到数据库的过程可以分为两步:读取 Excel 数据和将数据写入数据库。下面将分别进行说明。 读取 Excel 数据 安装必要的依赖包 shpip install pandas openpyxl 创建一个 Python 脚本,并导入 pandas 库 pythonimport pandas as pd 读取 Excel 文件 “`pyt…

    C 2023年5月22日
    00
  • C语言中字符和字符串处理(ANSI字符和Unicode字符)

    C语言中字符和字符串处理(ANSI字符和Unicode字符) 字符处理 在C语言中,字符是采用ANSI编码方式表示的,ANSI编码是一个字符编码标准,定义了128个字符,包括数字、大小写字母、标点符号、控制字符等,使用一个字节表示一个字符。使用字符类型(char)来存储一个字符。 基本字符类型 在C语言中,基本的字符类型是char,在头文件和中还定义了字符类…

    C 2023年5月23日
    00
  • C语言中如何进行异步编程?

    异步编程一般指的是在程序中同时执行多个任务,而不是等待一个任务完成后再执行下一个任务。在 C 语言中,我们可以通过多线程或者事件驱动编程来实现异步编程。 多线程 多线程是一种利用 CPU 多核特性,同时执行多个线程的技术。C 语言中可以使用 pthread 库实现多线程编程。 首先需要导入 pthread 库头文件: #include <pthread…

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