数据结构(4)—— 栈、队列代码重构实现

1 栈

1.1 顺序结构实现栈

#ifndef _SA_H
#define _SA_H

#include <sys/types.h>
typedef struct Stack{
    int *arr;
    size_t cap;
    size_t top;
}STACK;

void stack_init(STACK* stack,size_t cap);
void stack_deinit(STACK* stack);//释放内存
/*判断栈满或空*/
int stack_full(STACK* stack);
int stack_empty(STACK* stack);
/*入栈、出栈*/
void stack_push(STACK* stack,int data);
int stack_pop(STACK* stack);
/*取栈顶(不出栈)   元素数量*/
int stack_top(STACK* stack);
size_t stack_size(STACK* stack);

#endif
#include <stdlib.h>
#include "sa.h"

void stack_init(STACK* stack,size_t cap){
    stack->arr = malloc(cap * sizeof(int));
    stack->cap = cap;
    stack->top = 0;
}

void stack_deinit(STACK* stack){
    free(stack->arr);
    stack->arr = NULL;
    stack->cap = 0;
    stack->top = 0;
}

int stack_full(STACK* stack){
    return stack->top >= stack->cap;
}

int stack_empty(STACK* stack){
    return !stack->top;
}

void stack_push(STACK* stack,int data){
    stack->arr[stack->top] = data;
    stack-top++;
}

int stack_pop(STACK* stack){
    stack->top--;
    return stack->arr[stack->top];
}

int stack_top(STACK* stack){
    return stack->arr[stack->top - 1];
}

size_t stack_size(STACK* stack){
    return stack->top;
}
#include <stdio.h>
#include "sa.h"

int main(){
    STACK stack;
    stack_init(&stack,10);
    int i;
    for (i = 0;i < 7;i++){
        stack_push(&stack,i + 1);
    }
    while(!stack_empty(&stack){
        printf("%d\n",stack_pop(&stack));
    }
    stack_deinit(&stack);
}

1.2 链式结构实现栈

#ifndef _SL_H
#define _SL_H

#include <sys/types.h>
typedef struct StackNode{
    int data;
    struct StackNode* next;
}STACK_NODE;

typedef struct Stack{
    STACK_NODE* top;
}STACK;

void stack_init(STACK* stack);
void stack_deinit(STACK* stack);
int stack_empty(STACK* stack);//判断是否为空
void stack_push(STACK* stack,int data);//入栈
int stack_pop(STACK* stack);//出栈
int stack_top(STACK* stack);//查看栈顶而不出栈
size_t stack_size(STACK* stack);//元素个数

#endif
#include <stdlib.h>
#include "sl.h"

/*额外提供创建节点和销毁节点的函数(自用)*/
static STACK_NODE* create_node(int data,STACK_NODE* next){
    STACK_NODE* node = malloc(sizeof(STACK_NODE));
    node->data = data;
    node->next = next;
    return node;
}

static STACK_NODE* destroy_node(STACK_NODE*){
    STACK_NODE* next = node->next;
    free(node);
    return next;
}

void stack_init(STACK* stack){
    stack->top = NULL;
}

void stack_deinit(STACK* stack){
    while (stack->top)
        stack->top = destroy_node(stack->top);
}

int stack_empty(STACK* stack){
    return !stack->top;
}

void stack_push(STACK* stack,int data){
    stack->top = create_node(data,stack->top);
}

int stack_pop(STACK* stack){
    int data = stack->top->data;
    stack->top = destroy_node(stack->top);
    return data;
}

int stack_top(STACK* stack){
    return stack->top->data;
}

size_t stack_size(STACK* stack){
    size_t size = 0;
    STACK_NODE* node = stack->top;
    while (node){
        size++;
        node = node->next;
    }
}
#include <stdio.h>
#include "sl.h"

int main(){
    STACK stack;
    stack_init(&stack);
    int i;
    for (i = 0;i < 7;i++){
        stack_push(&stack,i + 1);
    }
    printf("size = %d\n",stack_size(&stack));
    while(!stack_empty(&stack){
        printf("%d\n",stack_pop(&stack));
    }
    stack_deinit(&stack);
}

2 队列

2.1 顺序结构实现队列

#ifndef _QA_H
#define _QA_H

#include <sys/types.h>
typedef struct Queue{
    int *arr;
    int cap;
    size_t front;
    size_t rear;
    size_t size;
}QUEUE;

//队列的初始化和删除
void queue_init(QUEUE* queue,size_t cap);
void queue_deinit(QUEUE* queue);

//判断队列的空和满
int queue_empty(QUEUE* queue);
int queue_full(QUEUE* queue);

void queue_push(QUEUE* queue,int data);
int queue_pop(QUEUE* queue);
int queue_front(QUEUE* queue);
size_t queue_size(QUEUE* queue);

#endif
#include <stdlib.h>
#include "qa.h"

void queue_init(QUEUE* queue,size_t cap){
    queue->arr = malloc(cap * sizeof(int));
    queue->cap = cap;
    queue->front = 0;
    queue->rear = 0;
    queue->size = 0;
}

void queue_deinit(QUEUE* queue){
    free(queue->arr);
    queue->arr = 0;
    queue->cap = 0;
    queue->front = 0;
    queue->rear = 0;
    queue->size = 0;
}

int queue_empty(QUEUE* queue){
    return !queue->size;
}

int queue_full(QUEUE* queue){
    return queue->size >= queue->cap;
}

void queue_push(QUEUE* queue,int data){
    if (queue->rear >= queue->cap)
        queue->rear = 0;
    queue->size++;
    queue->arr[queue->rear] = data;
    queue->rear++;
}

int queue_pop(QUEUE* queue){
    if (queue->front >= queue->cap)
        queue->front = 0;
    queue->size--;
    return queue->arr[queue->front++];
}

int queue_front(QUEUE* queue){
    if (queue->front >= queue->cap)
        queue->front = 0;
    return queue->arr[queue->front];
}

size_t queue_size(QUEUE* queue){
    return queue->size;
}
#include <stdlib.h>
#include "qa.h"

int main(){
    QUEUE queue;
    queue_init(&queue,5);
    int i;
    for (i = 0;!queue_full(&queue);i++){
        queue_push(&queue,i + 1);
    }
    while (!queue_empty(&queue)){
        printf("%d\n",queue_pop(&queue));
    }
    queue_deinit(&queue);
    return 0;
}

2.2 链式结构实现队列

#ifndef _QL_H
#define _QL_H

#include <sys/types.h>
typedef struct QueueNode{
    int data;
    struct QueueNode* next;
}QUEUE_NODE;

typedef struct Queue{
    QUEUE_NODE* front;
    QUEUE_NODE* rear;
}QUEUE;

void queue_init(QUEUE* queue);
void queue_deinit(QUEUE* queue);
int queue_empty(QUEUE* queue);
void queue_push(QUEUE* queue,int data);
int queue_pop(QUEUE* queue);
int queue_front(QUEUE* queue);
size_t queue_size(QUEUE* queue);

#endif
#include <stdlib.h>
#include "ql.h"

//创建节点和销毁节点函数(自用)
static QUEUE_NODE* create_node(int data){
    QUEUE_NODE* node = malloc(sizeof(QUEUE_NODE));
    node->data = data;
    node->next = NULL;
    return node;
}

static QUEUE_NODE* destroy_node(QUEUE_NODE* node){
    QUEUE_NODE* next = node->next;
    free(node);
    return next;
}

void queue_init(QUEUE* queue){
    queue->front = NULL;
    queue->rear = NULL;
}

void queue_deinit(QUEUE* queue){
    while (queue->front)
        queue->front = destroy_node(queue->front);
    queue->rear = NULL;
}

int queue_empty(QUEUE* queue){
    return !queue->front && !queue->rear;
}

void queue_push(QUEUE* queue,int data){
    QUEUE_NODE* rear = create_node(data);
    if (queue->rear)
        queue->rear->next = rear;
    else
        queue->front = rear;
    queue->rear = rear;
}

void queue_pop(QUEUE* queue){
    int data = queue->front->data;
    if (!(queue->front = destroy_node(queue->front)))
        queue->rear = NULL;
    return data;
}

int queue_front(QUEUE* queue){
    return queue->front->data;
}

size_t queue_size(QUEUE* queue){
    size_t size = 0;
    QUEUE_NODE* node = queue->front;
    for (;node;node = node->next)
        size++;
    return size;
}
#include <stdio.h>
#include "ql.h"

int main(){
    QUEUE queue;
    queue_init(&queue);
    int i;
    for (i = 0;i < 5;i++)
        queue_push(&queue,i + 1);
    printf("size = %d\n",queue_size);
    while (!queue_empty(&queue))
        printf("%d\n",queue_pop(&queue));
    queue_deinit(&queue);
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值