一、栈
1、栈的介绍
栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的有序集合。在C语言中,栈并不直接内置,但可以通过数组或链表等数据结构来模拟栈的行为。
2、栈的构建与使用
下面是利用C语言来完成初始化栈、判断栈空、判断栈满、入栈(push)、出栈(pop)和获取栈顶元素等操作
(2.1)初始化栈
//构建栈的结构体
#define MAX 100
typedef struct
{
int data[MAX];//数据数组,也称为栈的容量
int top;//栈顶,默认初始化为-1
}Stack;
//初始化栈
void stack_init(Stack *stack)
{
stack->top=-1;
}
(2.2)判断栈是否为空或满
//判断是否为空
bool if_Null(Stack *stack)
{
return stack->top==-1;//如果栈顶top等于-1则为真,栈空
}
//判断是否为满
bool if_Full(Stack *stack)
{
return stack->top==MAX-1;//如果栈顶top等于(MAX-1),栈满
}
(2.3)入栈操作
bool Push(Stack *stack,int num)
{
if(if_Full(stack))//判断栈是否满
return false;
stack->data[++(stack->top)]=num;//先改变top的大小再赋值
return true;
}
(2.4)出战操作
bool Pop(Stack *stack,int *num)
{
if(if_Null(stack))//判断栈是否为空
return false;
*num=stack->data[(stack->top)--];//先取值后改变栈顶大小
return true;
}
(2.5)获取栈顶
bool Gotop(Stack *stack,int *num)
{
if(if_Null(stack))
return false;
*num=stack->data[stack->top];//只取栈顶,不做其他任何操作
return true;
}
3、栈的示例完整代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
//构建栈的结构体
#define MAX 100
typedef struct
{
int data[MAX];//数据数组,也称为栈的容量
int top;//栈顶,默认初始化为-1
}Stack;
//初始化栈
void stack_init(Stack *stack)
{
stack->top=-1;
}
//判断是否为空
bool if_Null(Stack *stack)
{
return stack->top==-1;//如果栈顶top等于-1则为真,栈空
}
//判断是否为满
bool if_Full(Stack *stack)
{
return stack->top==MAX-1;//如果栈顶top等于(MAX-1),栈满
}
//入栈操作
bool Push(Stack *stack,int num)
{
if(if_Full(stack))//判断栈是否满
return false;
stack->data[++(stack->top)]=num;//先改变top的大小再赋值
return true;
}
//出栈操作
bool Pop(Stack *stack,int *num)
{
if(if_Null(stack))//判断栈是否为空
return false;
*num=stack->data[(stack->top)--];//先取值后改变栈顶大小
return true;
}
//获取栈顶
bool Gotop(Stack *stack,int *num)
{
if(if_Null(stack))
return false;
*num=stack->data[stack->top];//只取栈顶,不做其他任何操作
return true;
}
int main(int argc,char const *argv[])
{
Stack stack;
//初始化链表
stack_init(&stack);
//入栈
Push(&stack,1);
Push(&stack,2);
Push(&stack,3);
//出栈
int num;
Pop(&stack,&num);
printf("%d",num);
//取栈顶
Gotop(&stack,&num);
printf("%d",num);
}
二、队列
1、队列的介绍
队列(Queue)是一种先进先出(FIFO, First In First Out)的线性数据结构。它只允许在队列的前端(front)进行删除操作,在队列的后端(rear)进行插入操作。
2、队列的构建和使用
(2.1)初始化队列
#define MAX 5 // 定义队列的最大容量
struct Queue {
int items[MAX];
int front;
int rear;
};
// 初始化队列
void initQueue(struct Queue* q) {
q->front = -1;
q->rear = -1;
}
(2.2)判断队列是否为空或满
// 检查队列是否为空
int isEmpty(struct Queue* q) {
return q->front == -1;
}
// 检查队列是否已满
int isFull(struct Queue* q) {
return q->rear == MAX - 1;
}
(2.3)入队操作
// 入队操作
void enqueue(struct Queue* q, int value) {
if (isFull(q)) {
printf("队列已满,无法插入元素 %d\n", value);
} else {
if (q->front == -1) // 如果队列为空,插入第一个元素时,设置front
q->front = 0;
q->rear++;
q->items[q->rear] = value;
printf("插入元素 %d\n", value);
}
}
(2.4)出队操作
// 出队操作
int dequeue(struct Queue* q) {
int item;
if (isEmpty(q)) {
printf("队列为空,无法出队\n");
return -1;
} else {
item = q->items[q->front];
q->front++;
if (q->front > q->rear) { // 如果队列为空,重置front和rear
q->front = q->rear = -1;
}
return item;
}
}
(2.5)显示队列所有元素
// 显示队列元素
void displayQueue(struct Queue* q) {
if (isEmpty(q)) {
printf("队列为空\n");
} else {
printf("队列内容: ");
for (int i = q->front; i <= q->rear; i++) {
printf("%d ", q->items[i]);
}
printf("\n");
}
}
3、队列的示例完整代码
#include <stdio.h>
#include <stdlib.h>
#define MAX 5 // 定义队列的最大容量
struct Queue {
int items[MAX];
int front;
int rear;
};
// 初始化队列
void initQueue(struct Queue* q) {
q->front = -1;
q->rear = -1;
}
// 检查队列是否为空
int isEmpty(struct Queue* q) {
return q->front == -1;
}
// 检查队列是否已满
int isFull(struct Queue* q) {
return q->rear == MAX - 1;
}
// 入队操作
void enqueue(struct Queue* q, int value) {
if (isFull(q)) {
printf("队列已满,无法插入元素 %d\n", value);
} else {
if (q->front == -1) // 如果队列为空,插入第一个元素时,设置front
q->front = 0;
q->rear++;
q->items[q->rear] = value;
printf("插入元素 %d\n", value);
}
}
// 出队操作
int dequeue(struct Queue* q) {
int item;
if (isEmpty(q)) {
printf("队列为空,无法出队\n");
return -1;
} else {
item = q->items[q->front];
q->front++;
if (q->front > q->rear) { // 如果队列为空,重置front和rear
q->front = q->rear = -1;
}
return item;
}
}
// 显示队列元素
void displayQueue(struct Queue* q) {
if (isEmpty(q)) {
printf("队列为空\n");
} else {
printf("队列内容: ");
for (int i = q->front; i <= q->rear; i++) {
printf("%d ", q->items[i]);
}
printf("\n");
}
}
int main() {
struct Queue q;
initQueue(&q);
enqueue(&q, 10);
enqueue(&q, 20);
enqueue(&q, 30);
enqueue(&q, 40);
enqueue(&q, 50);
displayQueue(&q);
printf("出队元素: %d\n", dequeue(&q));
displayQueue(&q);
return 0;
}