数据结构队列及栈的实现

一. 链表

链表和数组对比各有各的特点,链表插入删除快,而数组查找快。插入和删除的时间复杂度都是O(n).注意到下面链表的定义是一种recursive type 递归定义. 很多数据结构都是这样定义的.

struct list
{
    elment data;
    struct list* next;
};
typedef struct list* list;

链表

二. 队列

队列是先进来的元素先删除,FIFO(first in first out).队列是由一个链表外加一个指向队列首部和队列尾部的结构组成

这里写图片描述

struct queue
{
    list front;//使用list类型是因为需要指向链表
    list back;
};

typedef struct queue* queue;
2.1 创建

只需要使用malloc为队列初始化一块内存,以及front,back指针

    queue q_new()
    {
    //这个结点只需要创建一次用来存放front,back指针
        queue q = (queue)malloc(sizeof(struct queue));
    //这个是初始化的空结点,把它的next域置为空值NULL
        list l = (list)malloc(sizeof(struct list));
        q->front = l;
        q->back = l;
        q->back->next = NULL;//用来说明是尾结点
        return q;
    }
2.2 插入

注意队列只能从尾部插入,所以只需要动一动尾部指针
这里生成的结点就是xx结点,而不是插入3结点,我没有使用额外的结点来表示队列尾部,而是没插入一个结点就把它的next域置为NULL表示队尾,每插入新的元素next域就会更新

这里写图片描述

    void enq(elment data,queue q)
    {

        list l = (l)malloc(sizeof(struct list));
        q->back->data = data;//这里是插入
        q->back->next = l;
        q->back = l;
        q->back->next = NULL;
    }
2.3 删除

队列只能删除头结点

这里写图片描述

    void deq(queue q)
    {
        q->front = q->front->next;
    }
2.4 实现
#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct list* list;
typedef struct queue* queue;

struct list
{
    char * data;
    struct list *next;
};
struct queue
{
    list front;
    list back;
};
queue q_new()//创建一个队列
{
    queue q = (queue)malloc(sizeof(struct queue));
    list  l = (list)malloc(sizeof(struct list));
    q->front = l;
    q->back = l;
    q->back->next = NULL;
    return q;
}
void enq(queue q,char* s)//插入一个数,注意插入的第一个数是插到初始化队列里面
{
    list l = (list)malloc(sizeof(struct list));
    q->back->data = s;
    q->back->next = l;
    q->back = l;
    q->back->next = NULL;
}
int is_empty(queue q)//判断队列是否为空
{
    return q->back == q->front;
}
void deq(queue q)//从队列里面删除一个元素
{
    if(is_empty(q) == 1)
    {
         printf("can not deq");
         exit(-1);
    }
    q->front = q->front->next;
}
void printq(list l,queue q)//打印队列里面的元素
{
   l = q->front;
   for(l = q->front ; l->next != NULL ;l = l->next)
   {
       printf("%s\n",l->data);
   }
}
int main()
{
   list l;
   queue q = q_new();
   enq(q,"fantasy");
   enq(q,"ming");
   printq(l,q);
   deq(q);
   printf("删除后\n");
   printq(l,q);
   return 0;
}

三. 栈

3.1 结构

栈遵循先进后出.
栈只需要一个栈顶指针指向栈顶就行,插入删除复杂度为O(n).
图中1表示最先进入的元素,3是最后入栈的top标识是栈顶
这里写图片描述

    struct stack
    {
        list stack;
    };
    typedef struct stack* stack;
3.2 创建
    stack s_new()
    {
        stack s = (s)malloc(sizeof(struct stack));
        s->top = NULL;
        return s;
    }
3.3 插入

这里写图片描述

    void push(elment data, stack s)
    {
        list l = (l)malloc(sizeof(struct list));
        l->data = data;
        l->next = s->top;
        s->top = l;
    }
3.4 删除

这里写图片描述

    element pop(stack s)
    {
        if(s->top != NULL)
        {
            element data = s->top->data;
            s->top = s->top->next;
            return data;
        }
        else 
            exit(-1);
    }
3.5 实现
#include<stdio.h>
#include<malloc.h>
typedef struct stack* stack;
typedef struct list* list;

struct list
{
    int data;
    struct  list *next;
};
struct stack
{
    list top;
};

stack s_new()
{
     stack s = (stack)malloc(sizeof(struct stack));
     s->top = NULL;
     return s;
}
void push(int data,stack s)
{
    list l = (list)malloc(sizeof(struct list));
    l->data = data;
    l->next = s->top;
    s->top = l;
}
void pop(stack s)
{
    if(s->top != NULL)
    s->top = s->top->next;
}
void print(stack s)
{
    list l;
    for(l = s->top;s->top!=NULL;l = s->top->next)
    {
        printf("%d\n",l->data);
    }
}
int main()
{
    stack s = s_new();
    push(30,s);
    push(50,s);
    push(80,s);
    print(s);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值