栈和队列的代码实现

什么是栈

栈是一种数据结构

  • 栈可以用来存放数字一次只能向栈里加入一个数字,一次也只能从栈里获得一个数字
  • 栈里的数字有前后顺序,先进入的数字在前,后进入的数字在后
  • 每次从栈里获得的数字一定是最后面的数字,最后获取的数字一定是最前面的数字
  • 这种使用数字的方法叫先进后出后进先出

栈的表示

//结构体类型,表示栈
typedef struct stack{
    int* arr; //记录存储区的首地址
    int top;//即将存入的元素下标
    int cap;// 容量
}stack_t;

 栈的操作

  • 向栈里加入数字的函数通常叫push,入栈
  • 从栈里获得数字的函数通常叫pop,出栈

栈的初始化

//栈的初始化
//stack_t sk
//stack_init(5,&sk)
void stack_init(int cap,stack_t* s){
    s->cap = cap;
    s->arr = malloc(sizeof(int) * cap);
    s->top = 0;
}

栈的释放

//栈的释放
void stack_deinit(stack_t* s){
    free(s->arr);
    s->arr = NULL;
    s->top = 0;
    s->cap = 0;
}

栈的判满

//栈的判满
int stack_full(stack_t* s){
    if(s->top == s->cap){
        return 1;
    }else{
        return 0;
    }
}

栈的判空

//栈的判空
int stack_empty(stack_t* s){
    if(s->top == 0){
        return 1;
    }else{
        return 0;
    }
}

压栈

//压栈
void stack_push(stack_t* s,int data){
    s->arr[s->top] = data;
    s->top++;
}

弹栈

//弹栈
int stack_pop(stack_t* s){
    return s->arr[--s->top];
}

在main.c文件调用上述栈的操作

#include<stdio.h>
#include"stack.h"//记录了栈的表示以及栈相应操作的函数声明

int main(){
    //栈
    stack_t sk;
    //栈的初始化
    stack_init(5,&sk);
    //压栈 1 2 3 4 5
    int data = 1;
    while(stack_full(&sk) != 1){
         stack_push(&sk,data++);
    }
    //弹栈
    while(stack_empty(&sk) != 1){
        printf("%d ",stack_pop(&sk));
        }
    printf("\n");
    //释放
    stack_deinit(&sk);
        return 0;
}

队列

什么是队列

  • 队列也是一种数据结构,队列也可以用来存放数字
  • 每次只能向队列里加入一个数字,每次只能从队列里获得一个数字
  • 在队列中,允许插入的一端称为队尾,允许删除的一端称为队头。
  • 它按照先进先出(FIFO)的原则存储数据,先进入队列的数据先出队列。类似于火车过山洞,车头最先进入山洞,也是最先出山洞。
  • 编写队列的时候也需要提供一个函数用来向队列里加入数字,还要提供一个函数用来从队列里获得数字

队列的表示

//队列
typedef struct queue{
    int* arr;//记录存储区的首地址
    int size;//有效元素个数
    int cap;//容量
    int front;//记录出队元素下标
    int rear;//记录入队元素下标
}queue_t;

队列的操作

  • 队列的插入操作,称为入队。
  • 队列的删除操作,称为出队。

队列的初始化

//队列的初始化
//queue_t q;
//queue_init(&q,5);
void queue_init(queue_t* q,int cap){
    q->arr = malloc(sizeof(int) * cap);
    q->size = 0;
    q->cap = cap;
    q->front = 0;
    q->rear = 0;
}

队列的释放

//队列的释放
void queue_deinit(queue_t* q){
    free(q->arr);
    q->arr = NULL;
    q->size = 0;
    q->cap = 0;
    q->front = 0;
    q->rear = 0;
}

队列判满

//队列判满 满1 非满0
int queue_full(queue_t* q){
    if(q->size == q->cap){
        return 1;
    }else{
        return 0;
    }
}

队列判空

//队列判空 空1 非空0
int queue_empty(queue_t* q){
    if(q->size == 0){
        return 1;
    }else{
        return 0;
    }
}

入队

//入队 (*q).size = q->size
void queue_push(queue_t* q,int data){
    if(!queue_full(q)){
        q->arr[q->rear] = data;
        q->rear = (q->rear + 1) % q->cap;
        q->size++;
    }else{
       fprintf(stderr,"队列已满");
    }
}

出队

//出队
int queue_pop(queue_t* q){
    if(!queue_empty(q)){
        int data = q->arr[q->front];
        q->front = (q->front + 1) % q->cap;
        q->size--;
        return data;
    }else{
       fprintf(stderr,"队列为空");
    }
}

//队列的实现
#include<stdio.h>
#include<stdlib.h>
#include"queue.h"//记录了队列的表示以及队列相应操作的函数声明

//队列的初始化
//queue_t q;
//queue_init(&q,5);
void queue_init(queue_t* q,int cap){
    q->arr = malloc(sizeof(int) * cap);
    q->size = 0;
    q->cap = cap;
    q->front = 0;
    q->rear = 0;
}
//队列的释放
void queue_deinit(queue_t* q){
    free(q->arr);
    q->arr = NULL;
    q->size = 0;
    q->cap = 0;
    q->front = 0;
    q->rear = 0;
}
//队列判满 满1 非满0
int queue_full(queue_t* q){
    if(q->size == q->cap){
        return 1;
    }else{
        return 0;
    }
}
//队列判空 空1 非空0
int queue_empty(queue_t* q){
    if(q->size == 0){
        return 1;
    }else{
        return 0;
    }
}
//入队 (*q).size = q->size
void queue_push(queue_t* q,int data){
    if(!queue_full(q)){
        q->arr[q->rear] = data;
        q->rear = (q->rear + 1) % q->cap;
        q->size++;
    }else{
       fprintf(stderr,"队列已满");
    }
}
//出队
int queue_pop(queue_t* q){
    if(!queue_empty(q)){
        int data = q->arr[q->front];
        q->front = (q->front + 1) % q->cap;
        q->size--;
        return data;
    }else{
       fprintf(stderr,"队列为空");
    }
}

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值