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

2023-10-09 05:52

本文主要是介绍【重拾C语言】六、批量数据组织(四)线性表—栈和队列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

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

6.1~3 数组基础知识

6.4 线性表——分类与检索

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

6.8 线性表—栈和队列

6.8.1 栈(Stack)

全局变量

isEmpty()

isFull()

push()

pop()

测试

6.8.2 队列(Queue)

全局变量

isEmpty()

isFull()

enqueue()

dequeue()

测试


前言

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

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

6.1~3 数组基础知识

【重拾C语言】六、批量数据组织(一)数组(数组类型、声明与操作、多维数组;典例:杨辉三角、矩阵乘积、消去法)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_63834988/article/details/133580645?spm=1001.2014.3001.5502

6.4 线性表——分类与检索

【重拾C语言】六、批量数据组织(二)线性表——分类与检索(主元排序、冒泡排序、插入排序、顺序检索、对半检索)_QomolangmaH的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_63834988/article/details/133620693?spm=1001.2014.3001.5501

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

【重拾C语言】六、批量数据组织(三)数组初值;字符串、字符数组、字符串数组;类型定义 typedef_QomolangmaH的博客-CSDN博客icon-default.png?t=N7T8https://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。
  • 可以使用数组来存储栈的元素。
全局变量
#define MAX_SIZE 100int stack[MAX_SIZE];
int top = -1;
  • 定义了一个常量 MAX_SIZE,它表示栈的最大容量
  • 声明了一个整型数组 stack,用于存储栈中的元素。
  • 声明了一个整型变量 top,用于表示栈顶的索引,默认值为 -1,表示栈为空。

isEmpty()

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

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

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

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

push()

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

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

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

int pop() {if (isEmpty()) {printf("Stack is empty. Cannot pop element.\n");return -1;}return stack[top--];
}
测试
#include <stdio.h>
#define MAX_SIZE 100int 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: %d\n", pop());printf("Popped element: %d\n", 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。
全局变量
#define MAX_SIZE 100int queue[MAX_SIZE];
int front = -1;
int rear = -1;
  • 定义了一个常量 MAX_SIZE,它表示队列的最大容量
  • 声明了一个整型数组 queue,用于存储队列中的元素。
  • 声明了两个整型变量 front 和 rear,分别表示队列的前端和后端的索引,默认值均为 -1,表示队列为空。
isEmpty()

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

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

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

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

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

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,否则取出队首元素并根据队列的循环性质更新 front 和 rear 的值。

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;
}

测试
#include <stdio.h>
#define MAX_SIZE 100int 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: %d\n", dequeue());printf("Dequeued element: %d\n", dequeue());return 0;
}
  • 调用 enqueue(10) 将元素 10 入队。
  • 调用 enqueue(20) 将元素 20 入队。
  • 调用 enqueue(30) 将元素 30 入队。
  • 调用 dequeue() 出队并打印出队的元素。
  • 再次调用 dequeue() 出队并打印出队的元素。

这篇关于【重拾C语言】六、批量数据组织(四)线性表—栈和队列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/170798

相关文章

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

使用Python实现批量分割PDF文件

《使用Python实现批量分割PDF文件》这篇文章主要为大家详细介绍了如何使用Python进行批量分割PDF文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、架构设计二、代码实现三、批量分割PDF文件四、总结本文将介绍如何使用python进js行批量分割PDF文件的方法

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端