几点说明:
1、队列是线性表的一种特殊情况
2、队列只允许在一端进行插入元素,在另一端删除元素;插入元素的一端称为队尾(rear),删除元素的一端称为队首(front)
3、队列的特点是“先进先出(FIFO)”
4、为便于操作初始化队列时,约定front=rear=-1,即让对头指针与队尾指针均指向数组下标为0的空间的前一个位置,这样当插入或删除元素时,队尾或对头指针均向后移位即可
5、在非空队列中,头指针front总是指向当前对头元素的前一个位置,尾指针rear总是指向当前队尾元素的位置
1.序队列的数据结构(C语言描述)如下:
#define MAXLEN 10 //定义队列的最大容量 typedef int Datatype; //数据类型 typedef struct { Datatype data[MAXLEN]; int front,rear; //定义对头与队尾指针 }SeQueue;
2.列初始化:
SeQueue InitSeQueue() //队列初始化操作 { SeQueue q; q.front=-1; q.rear=-1; return(q); }
3.入队操作:
int enterSeqQueue(SeQueue *q, int *x) //入队操作 { if(q->rear>=MAXLEN-1) //队列已满,插入失败 return(0); else { q->rear++; q->data[q->rear]=x; return(1); } }
4.出队操作:
int DelSeqQueue(SeQueue *q, int *x) //出队操作 { if(q->front==q->rear) //队列为空,无元素可删除 return(0); else { q->front++; *x=q->data[q->front]; return(1); } }
顺序队列的综合操作的完整程序如下:
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #define MAXLEN 10 //定义队列的最大容量 typedef int Datatype; //数据类型 typedef struct { Datatype data[MAXLEN]; int front,rear; //定义对头与队尾指针 }SeQueue; SeQueue InitSeQueue() //队列初始化操作 { SeQueue q; q.front=-1; q.rear=-1; return(q); } int Getfront_seq(SeQueue *q, int *x) //获取队首元素 { if(q->front==q->rear) return(0); else { *x=q->data[(q->front)+1]; return(1); } } int enterSeqQueue(SeQueue *q, int *x) //入队操作 { if(q->rear>=MAXLEN-1) //队列已满,插入失败 return(0); else { q->rear++; q->data[q->rear]=x; return(1); } } int Empty_seq(SeQueue *q) //判断队空 { return(q->front==q->rear); } int DelSeqQueue(SeQueue *q, int *x) //出队操作 { if(q->front==q->rear) //队列为空,无元素可删除 return(0); else { q->front++; *x=q->data[q->front]; return(1); } } void print(SeQueue q) { int n; if(q.front!=q.rear) { printf("队列的元素输出为: "); for(n=q.front+1;n<=q.rear;n++) printf("%d ",q.data[n]); } else printf("队列为空!!"); printf(" "); } main() { SeQueue Myqueue; int n,y,z,i,j; Myqueue=InitSeQueue(); if(Empty_seq(&Myqueue)!=0) printf(" 队列为空!"); else printf(" 队列非空!"); printf(" 请输入队列元素的数目: "); scanf_s("%d",&n); printf("请输入待入队的%d个元素: ",n); for(i=1;i<=n;i++) { scanf_s("%d",&y); enterSeqQueue(&Myqueue,y); } print(Myqueue); Getfront_seq(&Myqueue,&z); printf("当前队列的队头元素为: %d ",z); print(Myqueue); printf("请输入出队元素个数j(j要小于n): ",n); scanf_s("%d",&j); for(i=1;i<=j;i++) { DelSeqQueue(&Myqueue,&z); printf("%d ",z); } printf(" "); print(Myqueue); if(Empty_seq(&Myqueue)!=0) printf(" 队列为空!"); else printf(" 队列非空!"); system("pause"); }
结果为: