数据结构考研复习(循环队列)
这部分内容关于队列的顺序存储,关键点在于对于队空及队满这两种情况的处理,主要有以下三种方式:
- 牺牲一个存储数据单元用以区分
- 类型中增设表示元素个数的数据成员
- 类型中增设tag数据成员用以区分
下文采用了第一种形式。
#include<stdio.h> #define MaxSize 50 typedef struct{ int data[MaxSize]; int front,rear;//队首和队尾指针 }SqQueue; /* -1-初始化循环队列*/ void InitQueue(SqQueue &Q){ Q.rear = Q.front = 0;//初始化队首、队尾指针 } /* -2- 判断是否队空*/ bool isEmpty(SqQueue Q){ if(Q.rear == Q.front) { return true; } else { return false; } } /* -3- 入队(插入元素)*/ bool EnQueue(SqQueue &Q,int e){ if((Q.rear+1) % MaxSize == Q.front) { printf("队满!\n"); return false; } Q.data[Q.rear] = e; Q.rear = (Q.rear + 1) % MaxSize; //队尾指针加一取模 return true; } /* -4- 出队*/ bool DeQueue(SqQueue &Q,int &e){ if(isEmpty(Q)){ return false; } else{ e = Q.data[Q.front]; Q.front = (Q.front + 1) % MaxSize; } return true; } int main(){ SqQueue Q; InitQueue(Q); printf("*请输入队列长度:\n"); int e,length,temp,i=1; scanf("%d",&length); temp = length; printf("\n*请依次输入%d个元素\n",length); while(length > 0){ printf("请输入第%d个元素:\n",i); scanf("%d",&e); EnQueue(Q,e); length--; i++; } printf("\n*请进行选择:\n"); printf("==============\n\n"); printf("==1.循环出队\n"); printf("==2.当前队首、队尾元素\n"); int flag; scanf("%d",&flag); switch(flag){ case(1): { printf("\n当前队列为:\n"); while(temp > 0){ int e; if(temp != 1) { printf("%d->",Q.data[Q.front]); } else { printf("%d",Q.data[Q.front]); } DeQueue(Q,e); temp--; } break; } case(2): { printf("循环队列队尾不存放数据,因此当前队尾前一个位置的元素为:%d\n",Q.data[Q.rear-1]); printf("当前队首元素为:%d\n",Q.data[Q.front]); } } return 0; }
最终结果: