C语言数据结构之队列(FIFO)模板样式

①队列和显示,见名知意
②特点是: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值