顺序循环队列实现
注意:循环队列实现是以牺牲一个空间为前提,但总体来说可以提高整个队列的空间利用率
- 队空条件:rear == front
- 队满条件:front = (rear + 1)% MAX
- 入队:rear = (rear + 1) % MAX
- 出队:front = (front + 1) % MAX
实现代码
#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;
}
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;
}
int EmptyStack(seqstack_t *s)
{
if (NULL == s)
{
printf("stack is not exsit\n");
return 1;
}
return((s->top == -1) ? 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;
}
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];
}
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);
return 0;
}
运行结果