栈(Stack)和队列(Queue)

一、引言

        在计算机科学中,数据结构是组织、存储和管理数据的方式,它们对于高效地解决问题至关重要。栈和队列作为两种基本且常用的数据结构,在许多算法和实际应用中都有着广泛的使用。本文将深入探讨栈和队列实现与应用,帮助大家更好地理解这两种数据结构。

二、栈--后进先出的"叠盘子"

1.栈的定义

        栈是一种只能在一段进行插入和删除操作的线性表。当栈没有数据元素时成为空栈,栈的插入操作称为进栈或入栈,栈的操作称为出栈和退栈。有“后进先出”的特点,通俗点来说就是后进栈的元素先出栈,每次出栈的数据元素都是当前栈顶元素。

2.栈的相关操作

构建结构体

#define MAX_SIZE 100

typedef struct {
    int top;
    int data[MAX_SIZE];
} Stack;

初始化栈:创建一个空栈,通常会设置一个栈顶指针,初始时指向栈的底部。

void initStack(Stack *stack) {
    stack->top = -1;
}


入栈(Push):将元素添加到栈顶。

void push(Stack *stack,int val){
    if(isFull(stack)){
        printf("栈已满,无法入栈");
        return;
    }
    stack->data[++(stack->top)]=val;
}


出栈(Pop):从栈顶移除并返回一个元素。

int pop(Stack *stack){
    if(isEmpty(stack){
        printf("栈已空,无法出栈");
        return;
    }
    return stack->data[(stack->top)--];
}


查看栈顶元素(Peek):返回栈顶元素,但不将其从栈中移除。

int peek(Stack *stack){
    if(isEmpty(stack)){
        return -1;
    }
    return stack->data[stck->top];
}


判断栈是否为空(IsEmpty):检查栈中是否没有元素。

int isEmpty(Stack *stack){
   retrun stack->top==-1; 
}

判断栈是否满(isFull):检查栈是否装满元素

int isFull(Stack *stack){
    return stack->top==MAX_SIZE-1;
}

3.栈的应用

函数调用:计算机使用调用栈来管理函数调用和返回

撤销操作:编辑器中的撤销功能通常用栈实现

括号匹配:检查代码中的括号是否成对

浏览器历史:前进后退功能

表达式求值:如将中缀表达式转换为后缀表达式

三、队列--先进先出的"排队"

1.队列的定义

        队列是一种操作受限的线性表,仅允许在表的一端进行插入操作,也叫入队,而在表的另一端进行删除操作,也叫出队。把进行插入的一段成为队尾,把进行删除的一端成为队头后继元素成为队首元素。其特点为“先进先出”。

2.队列的操作

构建结构体

#define MAX_SIZE 100

typedef struct {
    int front;
    int rear;
    int data[MAX_SIZE];
}Queue;

初始化队列:创建一个空队列,通常需要设置队头和队尾指针,初始时都指向队列的起始位置。

void initQueue(Queue *queue){
    queue->front = queue->rear =-1;
}


入队(Enqueue):将元素添加到队尾。

void enqueue(Queue *queue,int val){
    if(isFull(queue)){
        printf("队列已满,无法入队");
        return;
    }
    queue->data[++queue->rear]=val;
}


出队(Dequeue):从队头移除并返回一个元素。

int dequeue(Queue *queue){
    if(isEmpty(queue)){
        printf("队列已空,无法出队");
        return -1;
    }
    return queue->data[++queue->front];
}


判断队列是否为空(IsEmpty):检查队列中是否没有元素。

int isEmpty(Queue *queue){
    return queue->front==queue->rear;
}

判断队列是否满(isFull):检查队列是否装满元素

int isFull(Queue *queue){
    return queue->rear==MAX_SIZE-1;
}

3.队列的实际应用

打印任务:打印机按接收顺序处理打印任务

消息队列:系统间异步通信

BFS算法:广度优先搜索使用队列

CPU任务调度:操作系统管理进程

客服系统:处理客户请求的顺序

四、总结

        栈和队列作为 C 语言中基础的数据结构,它们的特性和操作在许多编程场景中都有着重要的作用。通过本文对栈和队列的基本概念、操作以及 C 语言实现的介绍,希望大家能够对这两种数据结构有更深入的理解,并在实际编程中灵活运用它们来解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值