提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
顺序队列:
顺序队列是队列的顺序存储结构,顺序队列实际上是运算受限的顺序表。
1.头文件
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//队列(顺序队列)
//实现了简单的循环顺序队列操作,包括初始化,入队,出队,获取队列首元素,打印,清空
typedef struct Queue{
int *data;
int front, rear, cap;
} queue;
//初始化队列
queue *InitQueue(int n);
//入队
int QueuePush(queue *q, int x);
//出队
int QueuePop(queue *q);
//获取队列首元素
int QueueTop(queue *q);
//打印数据
void PrintQueue(queue *q);
//删除队列
void DeleteQueue(queue *q);
2.源文件
#include "seq_queue.h"
//初始化队列
queue *InitQueue(int n)
{
queue *q = (queue *)malloc(sizeof(queue));
q->data = (int *)malloc(sizeof(int) * n);
q->front = 0;
q->rear = 0;
q->cap = n;
return q;
}
//入队
int QueuePush(queue *q, int x)
{
assert(q != NULL);
if ((q->rear + 1) % q->cap == q->front)
{ //判断队列是否已满:(q->rear + 1) % q->cap == q->front
int *newData = (int *)realloc(q->data, sizeof(int) * (q->cap * 2));
if (newData == NULL)
{
printf("recalloc error!\n");
return -1;
}
for (int i = q->front, j = 0; i != q->rear; j++, i = (i + 1) % q->cap)
{
newData[j] = q->data[i];
}
q->data = newData;
q->cap = q->cap * 2;
}
q->data[q->rear++] = x;
return 0;
}
//出队
int QueuePop(queue *q)
{
assert(q != NULL);
if (q->front == q->rear)
{
printf("队列为空,不能出队\n");
return -1;
}
q->front++;
return 0;
}
//获取队列首元素
int QueueTop(queue *q)
{
assert(q != NULL);
if (q->front == q->rear)
{
printf("队列空了\n");
return -1;
}
return q->data[q->front];
}
//打印数据
void PrintQueue(queue *q)
{
assert(q != NULL);
printf("------------size = %d,cap = %d------------\n", (q->rear - q->front + q->cap) % q->cap, q->cap); //判断size :(q->rear - q->front + q->cap) % q->cap
for (int i = q->front; i != q->rear; i = (i + 1) % q->cap)
{
printf("%d ", q->data[i]);
}
printf("\n---------------------------------------\n");
}
//删除队列
void DeleteQueue(queue *q)
{
free(q->data);
q->data = NULL;
free(q);
}
int main()
{
int n, m;
scanf("%d %d", &n, &m);
queue *q = InitQueue(m);
for (int i = 0; i < n; i++)
{
int x;
scanf("%d", &x);
if (x == 0) //入队
{
scanf("%d", &x);
QueuePush(q, x);
}
else if (x == 1) //出队
{
QueuePop(q);
}
else if (x == 2) //获取栈顶元素
{
printf("栈顶元素为:%d\n", QueueTop(q));
}
PrintQueue(q);
}
DeleteQueue(q);
return 0;
}
3.注意
1.博客中标注原创的文章,版权归作者所有;
2.未经作者允许不得转载本文内容,否则将视为侵权;
3.转载或者引用本文内容请注明来源及原作者;
4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。