数据结构与算法之循环队列的操作
/*
循环队列的入队和出队算法设计
初始化循环队列 、打印队列、插入元素到循环队列、获取循环队列的首元素,元素不出队、出队、获取循环队列元素个数、判断循环队列的空和满。
核心:
循环队列入队, 队尾循环后移: SQ->rear =(SQ->rear+1)%Maxsize;
循环队列出队, 队首循环后移: SQ->front =(SQ->front+1)%Maxsize;
队空:SQ.front=SQ.rear; // SQ.rear 和 SQ.front 指向同一个位置
队满: (SQ.rear+1) %Maxsize=SQ.front; // SQ.rear 向后移一位正好是 SQ.front
计算元素的个数: (SQ.rear-SQ.front+Maxsize)% Maxsize;*/
//循环队列的入队和出队算法设计 #include<iostream> #include<Windows.h> #define MaxSize 6 //定义本循环队列的最大容量 using namespace std; typedef struct _LQueue { //循环队列 int sq[MaxSize]; int front; //循环队列的前指针 int rear; //循环队列的尾指针 }LqList; //初始化循环队列 bool InitLqList(LqList *duilie) { if (!duilie) return false; duilie->front = duilie->rear = 0; return true; } //插入元素到循环队列 bool InserLq(LqList* duilie, int &Element) { if (!duilie) return false; if ((duilie->rear + 1) % MaxSize == duilie->front) { cout << "该队列元素已满! "; } else { duilie->sq[duilie->rear] = Element; duilie->rear =( duilie->rear + 1)%MaxSize; } return true; } //打印队列 void PrintLq(LqList *duilie) { if (!duilie) return; cout << "本循环队列的元素依次是: "; int i = duilie->front; while (i != duilie->rear) { cout <<" "<< duilie->sq[i]; i = (i + 1) % MaxSize; } return; } //获取循环队列的首元素,元素不出队 bool GetLqFirst(LqList *duilie, int &Element) { if (!duilie) return false; Element = duilie->sq[duilie->front]; return true; } //出队 bool outLq(LqList *duilie,int &Element){ if (!duilie) return false; if (duilie->front == duilie->rear) { cout << "该队列是空队列! "; return false; } else { Element = duilie->sq[duilie->front]; duilie->front = (duilie->front + 1) % MaxSize; } return true; } //获取循环队列元素个数 void Getlen(LqList *duilie) { cout << "循环队列的元素个数是: " << (duilie->rear - duilie->front + MaxSize) % MaxSize; return; } int main(void) { LqList *duilie =new LqList; if (InitLqList(duilie)) { cout << "初始化循环队列成功! " << endl; } else { cout << "初始化循环队列失败! " << endl; } //循环队列入队 int num; //用户想要入队或者出队的个数 cout << "请输入你想要入队的个数(本程序设置的循环队列最大容量为5): "; cin >> num; //直到用户输入正确的入队个数为止 while (1) { if (num > MaxSize) { cout << "输入的数量超过了本队列的最大容量,请重新输入入队的个数: " << endl; cout << "请输入你想要入队的个数: "; cin >> num; } else { break; } } int Element = 0; for (int i = 0; i < num; i++) { cout << "请输入你想要插入的元素: "; cin >> Element; if (InserLq(duilie,Element)) { cout << "插入元素 " << Element << " 成功! " << endl; } else { cout << "插入元素失败! " << endl; } } //打印循环队列里的元素 PrintLq(duilie); //获取循环队列的首元素,元素不出列 if (GetLqFirst(duilie,Element)) { cout << "循环队列的首元素是: " << Element << endl; } else { cout << "获取循环队列首元素失败! " << endl; } //循环队列出队 cout << "请输入你想要出队的个数: "; cin >> num; cout << endl; //直到用户输入正确的出队个数为止 while (1) { if (num > (duilie->rear - duilie->front + MaxSize) % MaxSize) { cout << "输入的数量超过了本队列的最大容量,请重新输入出队的个数: " << endl; cout << "请输入你想要出队的个数: "; cin >> num; } else { break; } } for (int i = 0; i < num; i++) { if (outLq(duilie, Element)) { cout << "循环队列元素出队成功! 出队元素是: " << Element << endl; } else { cout << "循环队列元素出队失败! " << endl; } } PrintLq(duilie); Getlen(duilie); cout << "在入队一个元素吧,这可是循环队列哟!" << endl; cout << "请输入你想要插入的元素: "; cin >> Element; if (InserLq(duilie, Element)) { cout << "插入元素 " << Element << " 成功! " << endl; } else { cout << "插入元素失败! " << endl; } PrintLq(duilie); system("pause"); return 0; }