考研数据结构之队列(3.3)——练习题之设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag表示队列是空还是不空来设计队列的结构和相关基本运算算法(C表示)
生活随笔
收集整理的這篇文章主要介紹了
考研数据结构之队列(3.3)——练习题之设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag表示队列是空还是不空来设计队列的结构和相关基本运算算法(C表示)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
設計一個循環隊列,用front和rear分別作為隊頭和隊尾指針,另外用一個標志tag表示隊列是空還是不空,約定當tag為0時隊空,當tag為1時隊不空,這樣就可以用front==rear作為隊滿的條件要求,設計隊列的結構和相關基本運算算法(隊列元素是int型)。
分析
結構體定義:
/* 順序隊類型定義 */ typedef struct {int data[maxSize];int front;// 隊首指針int rear;// 隊尾指針int tag;// 表示隊列是空還是不空,約定tag=0時隊空,tag=1時隊不空 } SqQueue;要素:
- qu.tag=0;qu.front=qu.rear=0;// 初始時
- qu.front==qu.rear&&qu.tag==0;// 隊空條件
- qu.front==qu.rear&&qu.tag==1;// 隊滿條件
對于tag值的設置,初始時一定為0,插入成功后應設置為1,刪除成功后應設置為0.因為只有在插入操作后,隊列才有可能滿,在刪除操作后,隊列才有可能空。tag?的值再配合上front==rear這一句的判斷就能正確區分隊滿與隊空。
代碼
核心代碼:
/* 初始化隊列 */ void initQueue(SqQueue &qu) {qu.front=0;// 隊首和隊尾指針重合并指向0qu.rear=0;qu.tag=0;// 標志位表示隊空 }/* 判斷隊空 */ int isQueueEmpty(SqQueue qu) {if(qu.tag==0&&qu.front==qu.rear) { // tag=0表示隊空return 1;// 1表示判斷結果為空} else {return 0;// 0表示判斷結果為非空} }/* 判斷隊滿 */ int isQueueFull(SqQueue qu) {if(qu.tag==1&&qu.front==qu.rear) { // 由于有標志位tag,故可以用此等式判斷是否隊滿return 1;} else {return 0;} }/* 入隊 */ int enQueue(SqQueue &qu,int x) {if(isQueueFull(qu)==1) {return 0;} else {qu.rear=(qu.rear+1)%maxSize;// 若隊未滿,則移動指針qu.data[qu.rear]=x;// 再存入元素qu.tag=1;// 只要進隊就將tag設置為1,因為只有進隊才可能會發生隊滿return 1;} }/* 出隊 */ int deQueue(SqQueue &qu,int &x) {if(isQueueEmpty(qu)==1) { // 若隊空,則不能出隊return 0;} else {qu.front=(qu.front+1)%maxSize;// 若隊不空,則移動指針x=qu.data[qu.front];// 再取出元素qu.tag=0;// 只要有元素出隊,就把tag置為0,因為只有出隊才可能隊空return 1;} }完整代碼:
#include<stdio.h>#define maxSize 20/* 順序隊類型定義 */ typedef struct {int data[maxSize];int front;// 隊首指針int rear;// 隊尾指針int tag;// 表示隊列是空還是不空,約定tag=0時隊空,tag=1時隊不空 } SqQueue;/* 初始化隊列 */ void initQueue(SqQueue &qu) {qu.front=0;// 隊首和隊尾指針重合并指向0qu.rear=0;qu.tag=0;// 標志位表示隊空 }/* 判斷隊空 */ int isQueueEmpty(SqQueue qu) {if(qu.tag==0&&qu.front==qu.rear) { // tag=0表示隊空return 1;// 1表示判斷結果為空} else {return 0;// 0表示判斷結果為非空} }/* 判斷隊滿 */ int isQueueFull(SqQueue qu) {if(qu.tag==1&&qu.front==qu.rear) { // 由于有標志位tag,故可以用此等式判斷是否隊滿return 1;} else {return 0;} }/* 入隊 */ int enQueue(SqQueue &qu,int x) {if(isQueueFull(qu)==1) {return 0;} else {qu.rear=(qu.rear+1)%maxSize;// 若隊未滿,則移動指針qu.data[qu.rear]=x;// 再存入元素qu.tag=1;// 只要進隊就將tag設置為1,因為只有進隊才可能會發生隊滿return 1;} }/* 出隊 */ int deQueue(SqQueue &qu,int &x) {if(isQueueEmpty(qu)==1) { // 若隊空,則不能出隊return 0;} else {qu.front=(qu.front+1)%maxSize;// 若隊不空,則移動指針x=qu.data[qu.front];// 再取出元素qu.tag=0;// 只要有元素出隊,就把tag置為0,因為只有出隊才可能隊空return 1;} }/* 打印隊列 */ void printQueue(SqQueue qu) {printf("\n");while(qu.rear!=qu.front) {qu.front=(qu.front+1)%maxSize;printf("%d\t",qu.data[qu.front]);}printf("\n"); }int main() {SqQueue qu;int nums[]= {1,2,3,4,5,6};int n=6;initQueue(qu);for(int i=0; i<n; i++) {int m=enQueue(qu,nums[i]);// 將數組中的元素入隊}printQueue(qu);// 打印隊列int x;deQueue(qu,x);// 將元素1出隊printQueue(qu);// 打印隊列return 0; }運行結果:
總結
以上是生活随笔為你收集整理的考研数据结构之队列(3.3)——练习题之设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag表示队列是空还是不空来设计队列的结构和相关基本运算算法(C表示)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python实现之多元函数作图
- 下一篇: 计算机cpu配置,怎么看cpu配置?查看