#include <stdio.h>
#include <malloc.h>
typedef struct queue
{
int head;
int tail;//想到队列就要想到两个下标 一个头 一个尾
int *data;//定义一个指向数组的指针
int size;//指定长度
}Queue;
void init(Queue *queue,int size)
{
queue->head = 0;
queue->tail = 0;//初始化两个下标
queue->size = size;
queue->data = (int*)malloc(size * sizeof(int));
//把数组给定空间
}
int out(Queue *queue)
{
//这里之所以不写判空是因为我在最后写了一个判空的子函数
queue->head = (queue->head + 1) % queue->size;
int value = queue->data[queue->head];
return value;
}
int isempty(Queue *queue) //判空
{
return queue->head == queue->tail;
//当尾等于头的时候,就说明数据都被输出去了,没有了
}
int isfull(Queue *queue)
{
return (queue->tail + 1) % queue->size == queue->head;
//当尾+1等于头的时候 就说明满了
//这里可以结合我之前写的另一种实现方法里面给的图来理解
}
//我们要知道在队列中它是从下标为1的时候才开始存数据的
int add(Queue *queue,int value)
{
int *temp,k = 1;
if(queue->size == 0)
return -1;
//从这里开始自动扩展空间
if((queue->tail + 1) % queue->size == queue->head)
{
//每次扩展的空间为上一空间的两倍
temp = (int*)malloc(queue->size * 2 * sizeof(int*));
while(!isempty(queue))
{
temp[k++] = out(queue);//从1开始存入
//这里有个小知识 k++ 和 ++k
//简单举个例子
//如果k的初始值是1
// 那么经过k++之后的k(注意是之后的k)就变成2了
}
queue->head = 0;
queue->tail = k-1;
queue->size = queue->size * 2;
//这三步重新给queue赋值
//因为我们其他子函数都是涉及queue的
free(queue->data);
//因为我们是重新开辟的空间并传值
//所以传完值后之前的空间就没有用了要释放
queue->data = temp;
//这里让temp赋值给queue的data
}
queue->tail = (queue->tail + 1) % queue->size;
queue->data[queue->tail] = value;
return 1;
}
int main()
{
Queue queue;
init(&queue,5);
add(&queue,1);
add(&queue,12);
add(&queue,123);
add(&queue,1234);
add(&queue,12345);
add(&queue,123456);
add(&queue,1234567);
while(!isempty(&queue))
{
printf("%10d",out(&queue));
}
//这样自动扩展空间他就不会少输出值了
//但是有缺点,有很多空间浪费了。
return 0;
}
补充上面的小知识点
int main()
{
int k = 1;
printf("%d",k++);
}
结果为1
我也不太会讲,当前的你们自己试着写一写 ,自己体会一下 ,我把可能涉及的代码写在这里
int main()
{
int a = 1;
printf("%d\n",a++);
printf("%d",a);
}
结果为1 2
上面是a++
下面是++a
int main()
{
int a = 1;
printf("%d\n",++a);
printf("%d",a);
}
结果是 2 2
int main()
{
int a = 1;
printf("%d\n",a);
printf("%d",++a);
}
结果为1 2
我的理解就是a++的话 先是等于a 然后等于a+1
++a的话 先是等于a+1 然后等于a