数据与结构-队列
#include<stdio.h> #include<stdlib.h> #define MAXSIZE 20 //循环队列 typedef int datatype; typedef struct { datatype data[MAXSIZE];//队列的数据存储区 int front,rear;//队列的头尾指针 int size;//记录队列的长度 }CSeQueue; //初始化队列 CSeQueue InitSeQueue(CSeQueue *q) { q->front=q->rear=0; q->size=0; } CSeQueue InitSeQueue1(CSeQueue *q) { q->front=q->rear=0; q->size=0; printf("队列已被清空!\n"); } //入队rear移动 ++ int InSeQueue(CSeQueue *q,datatype x) { if((q->rear+1)%MAXSIZE==q->front) { printf("队满!"); return -1;//队满不能入队 } else{ q->rear=(q->rear+1)%MAXSIZE; q->data[q->rear]=x; q->size++; return 1;//入队成功 } } //出队front移动-- int outSeQueue(CSeQueue *q,datatype *x)//*x是带回值的指针 { if(q->front==q->rear) { printf("队空!"); return -1;//队空不能出栈 } else { q->front=(q->front+1)%MAXSIZE; *x=q->data[q->front];//读取最开始的入队元素 q->size++; return 1; } } //判队空 int EmptySeQueue(CSeQueue *q) { if(q->front==q->rear) return 1; else return -1; } //取队列首个元素 datatype Top_SeqStack(CSeQueue *q) { if(q->front==q->rear) { printf("队空!"); return -1;//队空不能出栈 } else { q->front=(q->front+1)%MAXSIZE; return (q->data[q->front]); } } //求队列长度 int long_SeqStack(CSeQueue *q) { return (q->rear-q->front+MAXSIZE)%MAXSIZE; } //遍历队列 void output(CSeQueue *q) { int i; i=(q->front+1); if(q->front!=q->rear){ while(i!=(q->rear+1)) { printf("%3d",q->data[i]); i++; }} else printf("队列空!无法遍历!\n"); } //5.队的遍历: void print(CSeQueue *q) { int i=0; i=q->front; while(q->rear != q->front) //直到队尾追上队头,也就是队为空,退出遍历 //每次输出的实际上是队的数据 { q->front = (q->front + 1) % MAXSIZE; printf("%3d", q->data[q->front]); } q->front=i; } int main() { CSeQueue q1; InitSeQueue(&q1); datatype num=1,num1,num2,num3; int num4,num6; printf("0表示退出队列\n"); printf("1表示入队列\n"); printf("2表示出队列\n"); printf("3表示取队列元素\n"); printf("4表示判断队列是否为空\n"); printf("5表示销毁栈\n"); printf("6表示求队列的长度\n"); printf("7遍历队列\n"); printf("8表示队列置空\n"); printf("请输入你的指令!\n"); while(num!=0) { printf("\n请输入指令:"); scanf("%d",&num); switch(num) { case 0:num=0; break; case 1:printf("请输入入队的元素:\n"); scanf("%d",&num1); InSeQueue(&q1,num1); break; case 2:outSeQueue(&q1,&num2); printf("%d\n",num2); break; case 3:num3=Top_SeqStack(&q1); printf("取队列首个的元素为:%d\n",num3); break; case 4:num4=EmptySeQueue(&q1); printf("判断结果为:%d\n",num4); printf("其中:1.为空,-1.为非空\n"); break; case 5:num=0; break; case 6:num6=long_SeqStack(&q1); printf("队列的长度为:%d",num6); break; case 7:print(&q1); break; case 8:InitSeQueue1(&q1); break; default: printf("输入指令错误,请重输!\n"); } } }