顺序循环队列实现

顺序循环队列实现

注意:循环队列实现是以牺牲一个空间为前提,但总体来说可以提高整个队列的空间利用率

  • 队空条件:rear == front
  • 队满条件:front = (rear + 1)% MAX
  • 入队:rear = (rear + 1) % MAX
  • 出队:front = (front + 1) % MAX
    在这里插入图片描述

实现代码

/*************************************************************************
	> File Name: seqstack.c
	> Author: HanRui
	> Mail: xautofhmm@gmail.com
	> Created Time: 2019年08月13日 星期二 09时27分09秒
 ************************************************************************/

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

#define LEN 20

typedef int data_t;
typedef struct
{
    data_t * data;
    int maxlen; //表示栈的最大容量
    int top; //指向栈顶指针
}seqstack_t;

/*
 *创建空栈
 * */
seqstack_t * CreateStack(int len)
{
    seqstack_t * s = (seqstack_t *)malloc(sizeof(seqstack_t));
    if (NULL == s)
    {
        printf("create stack pointer s error!\n");
        return NULL;
    }
    s->data = (data_t *)malloc(sizeof(data_t) * len);
    if (NULL == s->data)
    {
        printf("create stack data[] error!\n");
        return NULL;
    }
    s->maxlen = len;
    s->top = -1;
    return s;
}

/*
 *清空栈,成功返回0,失败返回-1
 * */
int ClearStack(seqstack_t *s)
{
    if (NULL == s || NULL == s->data)
    {
        printf("stack is not exsit or stack is empty!\n");
        return -1;
    }
    s->top = -1;
    return 0;
}

/*
 *判断是否栈空,栈空返回1, 非空返回0
 * */
int EmptyStack(seqstack_t *s)
{
    if (NULL == s)
    {
        printf("stack is not exsit\n");
        return 1;
    }
    return((s->top == -1) ? 1:0);
}

/*
 *判断是否栈满,栈满返回1, 非满返回0
 * */
int FullStack(seqstack_t *s)
{
    if (NULL == s)
    {
        printf("stack is not exsit!\n");
        return 0;
    }
    return ((s->top + 1) == s->maxlen ? 1:0);
}

/*
 *元素进栈
 *
 * */
void PushStack(seqstack_t *s, data_t x)
{
    if (NULL == s || NULL == s->data)
    {
        printf("stack is not exsit!\n");
        return;
    }
    if (FullStack(s))
    {
        printf("stack is already full!\n");
        return;
    }
    s->top++;
    s->data[s->top] = x;
}

/*
 *元素出栈,栈空或者不存在返回-1
 * 
 * */
data_t PopStack(seqstack_t * s)
{
    if (NULL == s)
    {
        printf("stack is not exsit!\n");
        return -1;
    }
    if (EmptyStack(s))
    {
        printf("stack is empty!\n");
        return -1;
    }
    s->top--;
    return s->data[s->top + 1];
}

/*
 *取栈顶元素,如果栈空或者栈不存在返回-1
 * */
data_t GetTop(seqstack_t *s)
{
    if (NULL == s || EmptyStack(s))
    {
        printf("stack is not exsit or stack is empty!\n");
        return -1;
    }
    return s->data[s->top];
}

/*
 *销毁栈
 * */
void DestroyStack(seqstack_t *s)
{
    if(NULL == s)
    {
        return;
    }
    free(s->data);
    s->data = NULL;
    free(s);
    s = NULL;
}


int main(int argc, char *argv[])
{
    seqstack_t * s = CreateStack(LEN);
    PushStack(s, 1);
    PushStack(s, 2);
    PushStack(s, 3);
    printf("top of stack:%d\n", GetTop(s));
    printf("if stack is empty ? %d\n", EmptyStack(s));
    printf("if stack is full ? %d\n", FullStack(s));
    printf("pop stack : %d\n", PopStack(s));
    printf("pop stack : %d\n", PopStack(s));
    printf("pop stack : %d\n", PopStack(s));
    printf("if stack is empty ? %d\n", EmptyStack(s));
    DestroyStack(s);
    //printf("s = %d, s->data = %d\n", s, s->data);
    return 0;
}

运行结果

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值