栈和队列的插入、删除、获取头尾元素操作

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈又称为后进先出的线性表。

Stack.h

#pragma once

#include<stdio.h>
#include<assert.h>
#include<Windows.h>

typedef int DataType;

typedef struct Stack
{
    DataType* _array;
    int _top; //栈顶
    int _end;//栈底
}Stack;

// 栈的实现接口
void StackInit(Stack* s);//栈初始化
void StackPush(Stack* s, DataType x);//压栈
void StackPop(Stack* s);//出栈
DataType StackTop(Stack* s);//栈顶元素
size_t StackSize(Stack* s);//栈大小
int StackEmpty(Stack* s);//栈判空
void StackDestory(Stack *s);//栈销毁

Stack.c

#include"Stack.h"

void StackInit(Stack* s)//初始化栈
{
    s->_array = NULL;
    s->_end = 0;
    s->_top = 0;
}

void StackPush(Stack* s, DataType x)//压栈
{
    assert(s);

    if (s->_end == s->_top)
    {   
        int size = (s->_end == 0) ? 5 : (s->_end) * 2;
        s->_array = (DataType*)realloc(s->_array, sizeof(DataType)*size);
        assert(s->_array);
        s->_end = size;
    }
    s->_array[s->_top++] = x;

}

void StackPop(Stack* s)//出栈

{
    assert(s);
    if (s->_top > 0)
    {
        s->_top--;
    }
}

DataType StackTop(Stack* s)//栈顶元素
{
    assert(s);
    return s->_array[s->_top - 1];

}
size_t StackSize(Stack* s)//栈大小
{
    assert(s);
    return s->_top;
}

int StackEmpty(Stack* s)//判空
{
    assert(s);
    return s->_top;
}

void StackDestory(Stack *s)//栈销毁
{
    assert(s);

    s->_end = 0;
    s->_top = 0;

    free(s->_array);
    s->_array = NULL;
}

Test.c

#include"Stack.h"

Test()
{
    Stack s;
    StackInit(&s);

    StackPush(&s, 5);
    StackPush(&s, 4);
    StackPush(&s, 3);
    StackPush(&s, 2);
    StackPush(&s, 1);

    printf("Stack has %d element.\n", StackSize(&s));//

    while (StackEmpty(&s))
    {
        printf("%d\n", StackTop(&s));
        StackPop(&s);
    }

    StackDestory(&s);
}

int main()
{
    Test();

    system("pause");
    return 0;
}

队列:一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列具有先进先出(FIFO)的特性顺序队列。

Queue.h

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<Windows.h>

typedef int DataType;


typedef struct QueueNode
{
    DataType _data;
    struct QueueNode* _next;
}QueueNode;

typedef struct Queue
{
    QueueNode* _head;
    QueueNode* _tail;
}Queue;

void QueueInit(Queue* q);//初始化队列
void QueuePush(Queue* q, DataType x);//入队列
void QueuePop(Queue* q);//出队列
DataType QueueFront(Queue* q);//队头元素
DataType QueueBack(Queue* q);//队尾元素
size_t QueueSize(Queue* q);//队列元素个数
DataType QueueEmpty(Queue* q);//判空
void QueueDestory(Queue* q);//销毁队列
void QueuePrint(Queue *q);//打印队列

Queue.c

#include"Queue.h"

void QueueInit(Queue* q)//初始化队列
{
    assert(q);
    q->_head = q->_tail = NULL;
}

void QueuePush(Queue* q, DataType x)//入队列
{
    assert(q);
    QueueNode *qNode = (QueueNode*)malloc(sizeof(QueueNode));
    assert(qNode);

    qNode->_data = x;
    qNode->_next = NULL;

    if (q->_head==NULL)//栈为空
    {

        q->_head = q->_tail = qNode;
    }
    else//栈不为空
    {
        q->_tail->_next = qNode;
        q->_tail = qNode;
    }

}

void QueuePop(Queue* q)//出队列
{
    assert(q && q->_head);

    QueueNode *tmp = q->_head;
    q->_head = tmp->_next;
    free(tmp);
    tmp = NULL;
}

DataType QueueFront(Queue* q)//队头元素
{
    assert(q && q->_head);

    return q->_head->_data;

}

DataType QueueBack(Queue* q)//队尾元素
{
    assert(q && q->_head);

    return q->_tail->_data;

}

size_t QueueSize(Queue* q)//队列元素个数
{
    assert(q);

    QueueNode *tmp = q->_head;
    DataType i = 0;
    while (tmp)
    {
        i++;
        tmp = tmp->_next;
    }
    return i;
}

void QueuePrint(Queue *q)//打印队列
{
    assert(q);

    QueueNode *tmp = q->_head;
    while (tmp)
    {
        printf("%d\n", tmp->_data);
        tmp = tmp->_next;
    }
}

DataType QueueEmpty(Queue* q)//判空
{
    assert(q);
    return q->_head == NULL ? 0 : 1;
}

void QueueDestory(Queue* q)//销毁队列
{
    assert(q);

    QueueNode *tmp = q->_head;
    while (tmp)
    {
        q->_head = tmp;
        tmp = tmp->_next;
        free(q->_head);
        q->_head = NULL;
    }

}

Test.c

#include"Queue.h"

Test()
{
    Queue q;

    QueueInit(&q);
    QueuePush(&q, 1);
    QueuePush(&q, 2);
    QueuePush(&q, 3);
    QueuePush(&q, 4);
    QueuePush(&q, 5);

    QueuePrint(&q);

    printf("Queue font is %d\n", (&q)->_head->_data);
    printf("Queue back is %d\n", (&q)->_tail->_data);
    printf("Queue size is %d\n", QueueSize(&q));

    QueuePop(&q);
    QueuePop(&q);
    QueuePush(&q, 7);
    QueuePush(&q, 8);
    QueuePush(&q, 9);

    while (QueueEmpty(&q))
    {
        printf("%d\n", (&q)->_head->_data);
        QueuePop(&q);
    }

    QueueEmpty(&q);

}


int main()
{
    Test();

    return 0;
    system("pause");
}
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值