日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

考研数据结构之队列(3.3)——练习题之设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag表示队列是空还是不空来设计队列的结构和相关基本运算算法(C表示)

發布時間:2023/12/8 编程问答 24 豆豆

題目

設計一個循環隊列,用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表示)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。