①队列和显示,见名知意
②特点是:FIFO = First input first output 先进先出
③从队尾进,从队头出
④循环队列问题。(假溢出)
#include <stdio.h>
#include <stdlib.h>
typedef struct Queue{
int *data; //动态数组
int head,tail; //头和尾
int length,sum; //长度和元素个数
}Queue;
//初始化队列
Queue *init(int n){
Queue *que = (Queue*)malloc(sizeof(Queue));
que->data = (int*)malloc(sizeof(int)*n);
que->head = que->tail = que->sum = 0;
que->length = n;
}
//入队操作
int Push(Queue *que,int val){
if(que == NULL) return 0; //先判断无法入队情况
if(que->sum == que->length) return 0;//队满了 怎么入?
que->data[que->tail++] = val; //入队 刚开始尾=0 入队后自增1 接着入下一个值 性质③
if(que->tail == que->length) que->tail = 0;//解决循环问题的关键
que->sum += 1; //入队后元素加1
return 1;
}
//出队操作
int Pop(Queue *que){//出队的都是队首元素,所以不需要传值
if(que == NULL) return 0;
if(que->sum==0) return 0;//也可以用判断为空的函数功能
//if(empty(que)) return 0;
que->head++;
if(que->head == que->length) que->head = 0;
que->sum -= 1;
return 1;
}
//判断队列是否为空
int empty(Queue *que){
return que->sum == 0;
}
//获取队首元素方法
int firstElement(Queue *que){
return que->data[que->head];
}
//队列的销毁
int clear(Queue *que)
{
if(que == NULL) return 0; //判断若为空则不用销毁哦
free(que->data);
free(que);
return 0;
}
//输出队列
int outPut(Queue *que){
printf("输出队列\n");
for(int i = que->head, j = 0; j < que->sum; j++){
int ind = (i+j) % que->length;
printf("%d ",que->data[ind]);
}
}
int main(){
int n,choose,val;
printf("你想要的队列长度");
scanf("%d",&n);
Queue *que = init(n);
do
{
printf("[1]入列\n");
printf("[2]出列\n");
scanf("%d",&choose);
switch(choose)
{
case 1:
printf("输入入队列的值");
scanf("%d",&val);
Push(que,val);
break;
case 2:
printf("出队操作");
Pop(que);
break;
}
outPut(que);
printf("此时的队列头=%d 尾=%d 队列长度=%d\n",que->head,que->tail,que->sum);
}while(choose<5);
return 0;
}