赞
踩
队列是一种特殊的线性表,它的特殊性体现在,它只能够从一段进,从另一端出,遵循先入先出的原则。这种独特的规则,可以运用在程序设计中的很多地方,非常的巧妙。
下面,我用C语言来实现了循环队列。
- /*******************************************************************/
- //描述:队列的顺序存储结构,该队列为循环队列,队列的创建,插入,删除等基本操作的函数,以及对这些操作进行验证
- //时间:2018.1.3 10:00
- //作者:Liu ZhenHua
- //*****************************************************************/
- #include <stdio.h>
- #include <stdlib.h>
- #define OK 1
- #define ERROR 0
- #define TRUE 1
- #define FALSE 0
- #define MAXSIZE 5
- typedef int Status;
- typedef char QElement;
- typedef struct{
- QElement data[MAXSIZE];
- int front; //头指针
- int rear; //尾指针
- }SqQueue;
- Status InitQueue(SqQueue *Q); //初始化队列,头指针和尾指针都指向零
- int QueueLength(SqQueue *Q); //获取队列长度
- Status ENQueue(SqQueue *Q,QElement e); //在队列末尾插入新元素
- void PrintSQ(SqQueue *Q); //顺序打印队列中的元素
- Status DEQueue(SqQueue *Q,QElement *e); //出队列操作
- void printSL(void); //打印一行分割线
- int main()
- {
- SqQueue *SQ;QElement val,*pval=&val;
- SQ = (SqQueue*)malloc(sizeof(SqQueue));
- if(InitQueue(SQ))printf("队列初始化成功!\n"); //初始化队列
-
- printf("队列中有%d个元素\n",QueueLength(SQ)); //获取元素长度
- printSL();
- if(ENQueue(SQ,'a'))printf("插入元素%c成功!\n",'a'); //入队列
- if(ENQueue(SQ,'b'))printf("插入元素%c成功!\n",'b');
- if(ENQueue(SQ,'c'))printf("插入元素%c成功!\n",'c');
- if(ENQueue(SQ,'d'))printf("插入元素%c成功!\n",'d');
- printf("队列中有%d个元素\n",QueueLength(SQ));
- PrintSQ(SQ);
- printSL();
- if(DEQueue(SQ,pval))printf("出队列操作成功!\n"); //出队列
- if(DEQueue(SQ,pval))printf("出队列操作成功!\n"); //出队列
- PrintSQ(SQ);
- if(ENQueue(SQ,'x'))printf("插入元素%c成功!\n",'x'); //循环式入队列
- if(ENQueue(SQ,'x'))printf("插入元素%c成功!\n",'x'); //循环式入队列
- PrintSQ(SQ);
- printf("结束!\n");
- return 0;
- }
- /**********************************************/
- //函数名: InitQueue
- //描述 : 初始化队列指针
- //参数 :队列指针
- //返回值:状态值
- //作者 :LiuZhenHua
- /**********************************************/
- Status InitQueue(SqQueue *Q){
- Q->front = 0;
- Q->rear = 0;
- return OK;
- }
- /**********************************************/
- //函数名: QueueLength
- //描述 : 获取队列长度
- //参数 :队列指针
- //返回值:长度值
- //作者 :LiuZhenHua
- /**********************************************/
- int QueueLength(SqQueue *Q){
- int f,r;
- f = Q->front;
- r = Q->rear;
- if(r >= f){
- return r-f;
- }else{
- return (r + MAXSIZE - f);
- }
- }
- /**********************************************/
- //函数名: printSL
- //描述 : 打印一行分割线Print Split Line
- //参数 :结无
- //返回值:无
- //作者 :LiuZhenHua
- /**********************************************/
- void printSL(void){
- int i;
- for(i = 0; i < 20; i++){
- printf("-");
- }
- printf("\n");
- }
- /**********************************************/
- //函数名: ENQueue
- //描述 : 若队列未满,则插入元素e到队尾
- //参数 :结构体指针,插入元素
- //返回值:状态值
- //作者 :LiuZhenHua
- /**********************************************/
- Status ENQueue(SqQueue *Q,QElement e){
- int f,r;
- f = Q->front;
- r = Q->rear;
- if((r+1)%MAXSIZE == f){
- return ERROR; //队列已满
- }
- Q->data[r] = e;
- Q->rear = (r+1)%MAXSIZE;
- return OK;
- }
- /**********************************************/
- //函数名: PrintSQ
- //描述 : 打印队列中的元素
- //参数 :结构体指针
- //返回值:状态值
- //作者 :LiuZhenHua
- /**********************************************/
- void PrintSQ(SqQueue *Q){
- int f,i,length;
- f = Q->front;
- length = QueueLength(Q);
- if(QueueLength(Q)==0){
- printf("队列为空!\n");
- }else{
- printf("队列中有%d个元素。分别是:\n",QueueLength(Q));
- for(i = 0; i < length; i++){
- printf("data[%d] = %c\n",f,Q->data[f]);
- f = (f+1)%MAXSIZE;
- }
- }
- }
- /**********************************************/
- //函数名: DEQueue
- //描述 : 循环队列的出队列操作
- //参数 :结构体指针,数据指针
- //返回值:状态值
- //作者 :LiuZhenHua
- /**********************************************/
- Status DEQueue(SqQueue *Q,QElement *e){
- int length,f;
- f = Q->front;
- length = QueueLength(Q);
- if(length == 0){
- return ERROR;
- }
- *e = Q->data[f];
- Q->front=(f+1)%6; //头指针后移
- return OK;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。