栈 和 队列

定义

栈,是限定仅在表尾进行插入或删除操作的线性表。表为段有其特殊含义,称为栈顶,表头端称为栈底。不含元素的空表称为空栈。

栈的存储结构

typedef int STDatatype;
typedef struct StackNode
{
        STDatatype* a;
        int top;
        int length;
}Stack;

栈的基本操作

//初始化
void  StackInit(Stack* pd);
//入栈
void StackPush(Stack* pd,STDatatype x);
//判空
bool StackEmpty(Stack* pd);
//出栈
void StackPop(Stack* pd);
//栈顶元素
STDatatype StackTop(Stack* pd);
//长度
int StackSize(Stack* pd);
//销毁
void StackDestroy(Stack* pd);

初始化

void  StackInit(Stack* pd)
{
    assert(pd);
    pd->a = NULL;
    pd->top = 0;
    pd->length = 0;
}

扩展空间

void StackSpace(Stack* pd)
{
        int length = pd->length == 0 ? 4 : pd->length * 2;
        STDatatype* tmp = (STDatatype*)realloc(pd->a,sizeof(STDatatype)*length);
        if (tmp == NULL)
        {
        perror("realloc fali");
        return;
        }
        pd->a = tmp;
        pd->length = length;
}

入栈

void StackPush(Stack* pd, STDatatype x)
{
        assert(pd);
        if (pd->top == pd->length)
        {
        StackSpace(pd);
            }
        pd->a[pd->top] = x;
        pd->top++;
}

判空

bool StackEmpty(Stack* pd)
{
        assert(pd);
        return pd->top == 0;
}

出栈

void StackPop(Stack* pd)
{
        assert(pd);
        assert(!StackEmpty(pd));
        pd->top--;
}

栈顶元素

STDatatype StackTop(Stack* pd)
{
        assert(pd);
        assert(!StackEmpty(pd));
        return pd->a[pd->top-1];
}

长度

int StackSize(Stack* pd)
{
        assert(pd);
        return pd->top;
}

销毁

void StackDestroy(Stack* pd)
{
        assert(pd);
        free(pd->a);
        pd->a = NULL;
        pd->top = 0;
        pd->length = 0;
}

队列

定义

队列是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端删除元素。

队列存储结构

typedef int QTDatatype;
typedef struct QueueNode
{
        struct QueueNode* next;
    QTDatatype data;
}QNode;
typedef struct Queue
{
    QNode* phead;//队列头结点
    QNode* tail;
//队列尾结点
        int size;
}Queue;

队列基础操作

//初始化
void QueueInit(Queue* qp);
//入队
void QueuePush(Queue* qp,QTDatatype x);
//判空
bool QueueEmpty(Queue* qp);
//出队
void QueuePop(Queue* qp);
//队头元素
QTDatatype QueueFront(Queue* qp);
//队尾元素
QTDatatype QueueBack(Queue* qp);
//队的长度
int QueueSize(Queue* qp);
//销毁
void QueueDestroy(Queue* qp);

初始化

void QueueInit(Queue* qp)
{
    assert(qp);
    qp->phead = NULL;
    qp->tail = NULL;
    qp->size = 0;
}

创建结点

QNode* BuyQueueNode(QTDatatype x)
{
        QNode* newnode = (QNode*)malloc(sizeof(QNode));
        if (newnode == NULL)
        {
        perror("malloc fail");
        return NULL;
        }
        newnode->data = x;
        newnode->next = NULL;
        return newnode;
}

入队

void QueuePush(Queue* qp, QTDatatype x)
{
        assert(qp);
        QNode* newnode = BuyQueueNode(x);
        if (qp->tail == NULL)//一个结点时
        {
        assert(qp->phead == NULL);
        qp->phead = qp->tail = newnode;
        }
        else
        {
        qp->tail->next = newnode;
        qp->tail = newnode;
        }
        qp->size++;
}

判空

bool QueueEmpty(Queue* qp)
{
        assert(qp);
        return qp->phead == NULL && qp->tail == NULL;
}

出队

void QueuePop(Queue* qp)
{
        assert(qp);
        assert(!QueueEmpty(qp));
        if (qp->phead->next == NULL)//一个结点时
        {
        free(qp->phead);
        qp->phead = qp->tail = NULL;
        }
        else
        {
        QNode* tail = qp->phead->next;
        
        free(qp->phead);
        qp->phead = tail;
        }
        qp->size--;
}

队头元素

QTDatatype QueueFront(Queue* qp)
{
        assert(qp);
        assert(!QueueEmpty(qp));
        return qp->phead->data;
}

队尾元素

QTDatatype QueueBack(Queue* qp)
{
        assert(qp);
        assert(!QueueEmpty(qp));
        return qp->tail->data;
}

队的长度

int QueueSize(Queue* qp)
{
        assert(qp);
        return qp->size;
}

销毁

void QueueDestroy(Queue* qp)
{
        assert(qp);
        QNode* cur = qp->phead;
        while (cur != NULL)
        {
        QNode* tail = cur->next;
        free(cur);
        cur = tail;
        }
        qp->phead = qp->tail = NULL;
        qp->size = 0;
}

有不足和错误的话,麻烦各位大佬指点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值