如何在C语言中实现栈和队列数据结构?

news/2024/11/23 3:46:58/

首先,我们都知道栈(Stack)是一种后进先出(LIFO)的数据结构,就像是一叠放在一起的盘子。你会发现,刚才我说的这句话就像是栈的定义,后面的话要等前面的话都处理完才能说。所以,让我们以吃薯片的例子来看看怎么实现栈:

首先,我们需要一个盘子,也就是栈的基本单元。只要有一个盘子,我们就可以往里面放薯片或者拿出来吃。在C语言中,我们可以使用结构体来定义一个盘子。

typedef struct {int data; // 薯片的数据
} Plate; // 盘子的定义

接下来,我们需要一个栈(Stack)来管理这些盘子。栈需要知道当前有多少个盘子(也就是栈的大小),还得知道哪个盘子是最上面的,这样我们才能放薯片或者拿出来吃。

#define STACK_SIZE 100 // 栈的大小typedef struct {Plate plates[STACK_SIZE]; // 盘子的数组int top; // 栈顶盘子的索引
} Stack; // 栈的定义

现在我们已经有了盘子和栈,但是还没有吃薯片的操作。我们需要实现一些基本的栈操作:入栈和出栈。

// 初始化栈
void initStack(Stack *stack) {stack->top = -1; // 栈顶初始化为-1,表示栈为空
}// 入栈操作
void push(Stack *stack, int data) {if (stack->top < STACK_SIZE - 1) { // 如果栈还没满Plate newPlate;newPlate.data = data;stack->plates[++stack->top] = newPlate; // 新盘子入栈} else {printf("盘子满了,不能再放薯片了!\n");}
}// 出栈操作
int pop(Stack *stack) {if (stack->top >= 0) { // 如果栈不为空return stack->plates[stack->top--].data; // 返回栈顶盘子的数据,同时栈顶指针减一} else {printf("没有盘子可以吃了!\n");return -1;}
}

好了,现在我们已经实现了一个简单的栈。你可以试着用这些函数来入栈、出栈薯片。比如,先入栈3个薯片,然后再出栈2个薯片:

int main() {Stack stack;initStack(&stack); // 初始化栈push(&stack, 1); // 入栈薯片1push(&stack, 2); // 入栈薯片2push(&stack, 3); // 入栈薯片3// 出栈薯片int potato1 = pop(&stack);printf("吃了薯片:%d\n", potato1);int potato2 = pop(&stack);printf("吃了薯片:%d\n", potato2);return 0;
}

这样,我们就实现了一个小小的栈。当然,实际上栈还可以进行更多的操作,比如获取栈顶的薯片但不拿出来、查看栈是否为空等等。不过,我们在这里只是做了一个简单的演示,希望你能理解栈的基本操作。

接下来,我们来看看队列(Queue)这个数据结构。队列是一种先进先出(FIFO)的结构,就像是排队买东西一样,先来的人先被服务。所以,我们可以用买咖啡的例子来看看怎么实现队列。

首先,我们需要一个队伍,也就是队列的基本单元。在C语言中,我们可以使用结构体来定义一个队伍的成员。

typedef struct {int data; // 咖啡的数据
} Person; // 队伍的定义

然后,我们需要一个队列(Queue)来管理这些队伍成员。队列需要知道当前有多少人在队伍中,还需要知道队伍的前后位置。这样我们才能把人加入队伍或者把人请出去。

#define QUEUE_SIZE 100 // 队列的最大长度typedef struct {Person people[QUEUE_SIZE]; // 人的数组int front; // 队伍的前面位置int rear; // 队伍的后面位置
} Queue; // 队列的定义

现在我们已经有了人和队列,但是还没有买咖啡的操作。我们需要实现一些基本的队列操作:入队和出队。

// 初始化队列
void initQueue(Queue *queue) {queue->front = 0; // 队伍前部位置为0queue->rear = -1; // 队伍后部位置为-1,表示队列为空
}// 入队操作
void enqueue(Queue *queue, int data) {if (queue->rear < QUEUE_SIZE - 1) { // 如果队列还没满Person newPerson;newPerson.data = data;queue->people[++queue->rear] = newPerson; // 新成员入队} else {printf("队伍已满,不能继续排队了!\n");}
}// 出队操作
int dequeue(Queue *queue) {if (queue->rear >= queue->front) { // 如果队列不为空return queue->people[queue->front++].data; // 返回队伍前部成员的数据,同时队伍前部位置加一} else {printf("队伍中没有人可以买咖啡了!\n");return -1;}
}

现在我们已经实现了一个简单的队列。你可以试着用这些函数来入队、出队成员。比如,先入队3个人,然后再出队2个人:

int main() {Queue queue;initQueue(&queue); // 初始化队列enqueue(&queue, 1); // 1号人入队enqueue(&queue, 2); // 2号人入队enqueue(&queue, 3); // 3号人入队// 出队成员int person1 = dequeue(&queue);printf("买咖啡的是第%d号人\n", person1);int person2 = dequeue(&queue);printf("买咖啡的是第%d号人\n", person2);return 0;
}

这样,我们就实现了一个小小的队列。当然,实际上队列还可以进行更多的操作,比如查看队列是否为空、获取队头成员但不出队等等。我希望你能通过这些例子理解栈和队列的基本操作,然后自己去尝试实现更复杂的功能。


http://www.ppmy.cn/news/563344.html

相关文章

Facebook Insights分析工具解读,掌握关键数据指标

什么是Facebook Insights&#xff1f; Facebook Insights是Facebook平台上的一项内置分析工具&#xff0c;旨在帮助企业和品牌了解其在Facebook上的表现和受众互动情况。该工具提供了丰富的数据和指标&#xff0c;可以帮助用户洞察粉丝群体、了解发布内容的表现&#xff0c;并…

笔记本电脑键盘坏了,有密码应该如何打开?(生活小技巧)

有时候笔记本电脑的键盘突然坏了&#xff0c;在笔记本电脑有密码的情况下我们却又急需笔记本里的资料应该怎么办呢。&#xff08;方法很多&#xff0c;这里只说最简单的一种&#xff09; 1.首先打开笔记本&#xff0c;生成登录页面后&#xff0c;看左下角&#xff0c;点开它&a…

Vlan(Access、Trunk、Hybrid)与ARP(免费ARP)讲解

目录 Vlan讲解 Vlan标签 二层接口类型 ARP ARP的作用 ARP地址解析报文讲解 免费ARP报文讲解 ARP缓存表 Vlan讲解 Vlan&#xff08;Virtual Local Area Network&#xff09;虚拟局域网&#xff0c;将一个物理的LAN在逻辑上划分为多个广播域&#xff1b;可以理解为一个V…

计算机键盘时好时坏,为何键盘时好时坏有时就用不成了

其实这个问题我自己解决了&#xff0c;自问自答&#xff0c;把方法和大家共享&#xff1a; 方法就是&#xff1a;关键盘大法 1、 把G6先关闭&#xff0c;然后在IVT BLUESOLEIL的控制面板里&#xff0c;点搜索设备&#xff0c;同时&#xff0c;打开蓝牙键盘G6的开关&#xff0c;…

计算机密码无法输完整,笔记本电脑键盘失灵无法输入密码怎么解决

很多朋友平时在使用笔记本电脑的时候&#xff0c;为了保护个人的隐私安全&#xff0c;通常都会给电脑设置上开机密码&#xff0c;但是当我们的笔记本电脑键盘失灵无法输入字符时&#xff0c;笔记本从关机的状态启动进入输入锁屏密码界面的时候&#xff0c;又能怎样解决呢&#…

笔记本电脑键盘帽坏掉了

请人帮修好。还是有人帮修好。真快&#xff0c;又清松

以太网通信的回环测试

PHY 芯片通常带有回环&#xff08;Loopback&#xff09;功能&#xff0c;用于 PHY 通信链路的测试。本文主要讨论三种常用 PHY 芯片的回环功能&#xff0c;并使用 Broadcom 的 B50612D 芯片进行 PHY 回环测试。 1 常见PHY芯片的回环功能 1.1 KSZ9031 KSZ9031 芯片支持以下两种…

前端10年进化 Node.js、模块化、CommonJS、AMD、CMD、Webpack、Vue-cli、Electron-vue

从模块化说起 模块化是什么时候提出的&#xff1f;怎么实现js代码的模块化&#xff0c;为什么要做模块化&#xff1f; 模块化的概念在软件开发领域已经存在很长时间&#xff0c;但在 JavaScript 中的模块化发展相对较晚。以下是对您提出的问题的回答&#xff1a; 提出时间&am…