前言
本文介绍了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。
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--];
}
测试
代码语言: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
,用于存储队列中的元素。 - 声明了两个整型变量
front
和rear
,分别表示队列的前端和后端的索引,默认值均为 -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
存储到相应位置。
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;
}
测试
代码语言: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()
出队并打印出队的元素。