队列与栈基础

一.队列

只允许在一端进行插入操作,一端进行删除操作的先进先出的线性表。

这里提供顺序表和链表两种实现队列的方法。

一.顺序表实现队列

在顺序表的基础上,队列的结构定义包括如下:

typedef struct Queue{
    vector *data;
    int size, head, tail, count;
}Queue;

data指向数据存储区, size为存储区可存储的数据个数,head,tail头尾指针,count实际存储的数据个数。

队列的相关结构操作

队列的初始化:

Queue *init_Queue(int n){ //队列初始化
    Queue *p = (Queue *)malloc(sizeof(Queue));
    p -> data = init_Vector(n);
    p -> size = n;
    p -> head = p -> tail = p -> count = 0;
    return p;
}

队列销毁:

void clear(Queue *p){//销毁队列
    if(p == NULL) return ;
    clear_Vector(p -> data);
    free(p);
}

队列判空:

int empty(Queue *p){ //检查队列是否为空
    return p -> count == 0;
}

入列:

int push(Queue *p, int val){ //入列
    if(p -> count == p -> size) return 0;
    insert_Vector(p -> data, p -> tail, val);
    p -> tail += 1;
    if(p -> tail == p -> size) p -> tail = 0;
    p -> count += 1;
    return 1;
}

出列:

int pop(Queue *p){//出列
    if(empty(p)) return 0;
    p -> head += 1;
    p -> count -= 1;
    return 1;
}

读取头元素:

int front(Queue *p){ //查看队列的第一个值
    return seek_Vector(p -> data, p -> head);
}

其中顺序表的相关结构操作如下:

typedef struct vector{
    int *data;
    int size;
}vector;

vector *init_Vector(int n){ //顺序表初始化
    vector *p = (vector*)malloc(sizeof(vector));
    p -> data = (int*)malloc(sizeof(int) * n);
    p -> size = n;
    return p;
}
int insert_Vector(vector *p, int pos, int val){//顺序表的插入
    if(pos < 0 || pos >= p -> size) return 0;
    p -> data[pos] = val;
    return 1;
}
int seek_Vector(vector *p, int pos){//查看顺序表指定位置的值
    if(pos < 0 || pos >= p -> size) return -1;
    return p -> data[pos];
}
void clear_Vector(vector *p){//顺序表销毁
    if(p == NULL) return ;
    free(p -> data);
    free(p);
    return ;
}

二.链表实现队列

在链表的基础上,队列的结构定义包括:

typedef struct Queue{
    LinkList *l;
    int count;
}Queue;

一个链表和记录当前队列存储元素的个数。

队列的相关结构操作

队列初始化:

Queue *init_Queue(){ //初始化队列
    Queue *p = (Queue*)malloc(sizeof(Queue));
    p -> l = init_LinkList();
    p -> count = 0;
    return p;
}

队列销毁:

void clear(Queue *p){ //队列销毁
    if(p == NULL) return ;
    clear_LinkList(p -> l);
    free(p);
    return ;
}

队列判空:

int empty(Queue *p){ //队列检查是否为空
    return p -> count == 0;
}

读取头元素:

int front(Queue *p){ //查看队列的第一个值
    if(p == NULL) return 0;
    return front_LinkList(p -> l);;
}

入列:

int push(Queue *p, int val){//入列
    insert_LinkList(p -> l, val);
    p -> count += 1;
    return 1;
}

出列:

int pop(Queue *p){//出列
    erase_LinkList(p -> l);
    p -> count -= 1;
    return 1;
}

相应的链表的结构操作如下:

typedef struct node{
    struct node *next;
    int data;
}node;

typedef struct LinkList{
    node head, *tail; //头结点和尾指针
}LinkList;

node *get_new_node(int val){ //创建链表节点
    node *p = (node *)malloc(sizeof(node));
    p -> data = val;
    p -> next = NULL;
    return p;
}

LinkList *init_LinkList(){//初始化链表
    LinkList *p = (LinkList*)malloc(sizeof(LinkList));
    p -> head.next = NULL;
    p -> tail = &(p -> head);
    return p; 
}
int front_LinkList(LinkList *l){ //查看链表的第一个元素
    if(l -> head.next == NULL) return 0;
    return l -> head.next -> data;
}
int insert_LinkList(LinkList *l, int val){ //在链表尾部插入一个值
    node *x = get_new_node(val);
    l -> tail -> next = x;
    l -> tail = x;
    return 1;
}
void erase_LinkList(LinkList *l){ //删除链表头部的值
    if(l -> head.next == NULL) return ;
    node *p = l -> head.next;
    l -> head.next = p -> next;
    if(l -> tail == p) l -> tail = &(l -> head);
    free(p);
    return ;
}
void clear_LinkList(LinkList *l){ //销毁链表
    node *p = l -> head.next, *q;
    while(p){
        q = p -> next;
        free(p);
        p = q;
    }
    free(l);
    return ;
}

二.栈

栈是只允许一端进行插入和删除操作的先入后出的线性表。

这里用数组实现相关操作。

栈的结构定义包括一片数据存储区,表示该区域可存储元素个数的size和指向栈顶元素的指针top

typedef struct Stake{
    int *data;
    int size, top;
}Stake;

栈的相关结构操作

栈的初始化:

Stake *init_Stake(int n){
    Stake *p = (Stake*)malloc(sizeof(Stake));
    p -> data = (int*)malloc(sizeof(int) * n);
    p -> size = n;
    p -> top = -1;
    return p;
}

栈的销毁:

void clear(Stake *p){
    if(p == NULL) return ;
    free(p -> data);
    free(p);
    return ;
}

栈判空:

int empty(Stake *p){
    return p -> top == -1;
}

查看栈顶元素:

int top(Stake *p){
    if(empty(p)) return 0;
    return p -> data[p -> top];
}

入栈:

int push(Stake *p, int val){
    if(p -> top + 1 == p -> size) return 0;;
    p -> top += 1;
    p -> data[p -> top] = val;
    return 1;
}

出栈:

int pop(Stake *p){
    if(empty(p)) return 0;
    p -> top -= 1;
    return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值