小白学C语言数据结构之栈和队列

本文介绍了栈和队列的基本概念和实现方式。栈是先进后出(LIFO)结构,仅有一个端点,而队列是先进先出(FIFO)结构,有两个端点。文中通过C语言实现栈和队列的节点定义,以及入栈、出栈、入队、出队等基本操作,并提供了判断栈或队列是否为空及计算大小的方法。
摘要由CSDN通过智能技术生成

栈和队列的结构

先实现节点

struct Node{
    int value;   //数据
    struct Node* next;
};

栈是先进后出

比如我压入 1 2 3 4 5

弹出来的顺序就是 5 4 3 2 1

所以只需要记录栈顶元素就可以了,因为只能在一边操作...

struct Stack{
    struct Node* top;
};

队列

队列是先进先出

我放入1 2 3 4 5

走出来就是 1 2 3 4 5

队列像是一条管道,可以在双边操作,所以记录队首元素和队尾元素

struct Queue{
    struct Node* front;  //队首
    struct Node* rear;   //队尾
};

没什么好说的很容易理解...

基本操作

栈(stack)

入栈

入栈操作,就是把新的节点压入栈的顶部,所以什么都不用返回, 用void

输入的东西应该就是 栈和要压入栈的值

void push(struct Stack* stack, int data){
    struct Node* newnode = (struct Node*)malloc(sizeof(struct Node)); 
    newnode->value = data;           //新节点赋值
    newnode->next = stack->top;      //让新节点的下一个指针指向之前的top节点
    stack->top = newnode;            // 这个压进栈里的元素成为新的top
}   

出栈

出栈操作,就是把栈中的top节点弹出来~

那输入的东西应该只需要 stack一个

但返回值需要变成新的top 在这里面应该就是新top的value 用int类型

int pop(struct Stack* stack){
    if(stack->top ==NULL){
        printf("Error: stack is empty");
        return -1;
    }
    int data = stack->top->value;   //找一个data存储弹出来的值
    struct Node* temp = stack->top;   //这行的目的就是记录下原本的top指针方便释放内存
    stack->top = stack->top->next;    //原本top->next变成新的top
    free(temp);
    return data;
}   

判断是否为空(有没有都行)

bool is_empty(struct Stack* stack){
    return stack->top ==NULL;
}

看栈的size

int size(struct Stack* stack) {
    if(is_empty(stack)){
        return 0;
    }
    int count = 0;
    struct Node* node = stack->top;
    while (node != NULL) {
        count++;
        node = node->next;
    }
    return count;
}

队列

size和is_empty就不写了,跟栈几乎一毛一样...

入队

入队操作,是从队尾往里进,也就是说要让原本的rear->next指向newnode,让newnode变成新节点

void enqueue(struct Queue* queue, int data){
    struct Node* newnode = (struct Node*)malloc(sizeof(struct Node*));
    //初始化newnode  data放进去,下一节点指向空
    newnode->value =data;
    newnode->next=NULL;
    if(queue->rear ==NULL){
        queue->front= queue->rear= newnode;
    }
    else{
        queue->rear->next = newnode;               // newnode是rear->next
        queue->rear = newnode;                    //newnode 变成新的rear
    }
}

出队

出队操作,类似出栈,就是需要释放空间那块不太好记0.0

int dequeue(struct Queue* queue){
    if(is_empty(queue)){            //先判断是不是空
        printf("Error:the queue is already empty");
        return -1;
    }
    int data = queue->front->value;        
    struct Node* temp = queue->front;
    queue->front = queue->front->next;       
    
    free(temp);
    return data;
}

总结

栈和队列作为基础的数据结构,后续题目很多应用...一定熟记写法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值