奇藝廣州網(wǎng)站建設(shè) 熊掌號汕尾網(wǎng)站seo
🚀write in front🚀
📜所屬專欄:
🛰?博客主頁:睿睿的博客主頁
🛰?代碼倉庫:🎉VS2022_C語言倉庫
🎡您的點贊、關(guān)注、收藏、評論,是對我最大的激勵和支持!!!
關(guān)注我,關(guān)注我,關(guān)注我,你們將會看到更多的優(yōu)質(zhì)內(nèi)容!!
文章目錄
- 前言:
- 例題1:
- 例題2:
- 例題3:
- 例題4:
- 例題5:
- 總結(jié)
前言:
??在前面的學習中外面學習了棧與隊列。但是似乎對于棧與隊列的理解卻很潛,今天通過這些選擇題和oj題來加深認識。
例題1:
答案:C
在這里我們要先弄清楚棧的實現(xiàn)方法:
??順序表和鏈表都可以用來實現(xiàn)棧,不過一般都使用順序表,因為棧相當于是閹割版的順序表,只用到了順序表的尾插和尾刪操作,順序表的尾插和尾刪不需要搬移元素效率非常高,故一般都是使用順序表實現(xiàn)。
??當然,我們也可以通過鏈表的頭插和頭刪來實現(xiàn)棧,頭插與頭刪也正好滿足了棧的“先進后出“的性質(zhì)。
??此時,鏈表的優(yōu)點就出來了,每次入棧相當于鏈表中頭插一個節(jié)點,沒有擴容一說。
例題2:
答案:A B
A錯誤:棧是尾部插入和刪除,一般使用順序表實現(xiàn),隊列是頭部刪除尾部插入,一般使用鏈表實現(xiàn)
B錯誤:棧是后進先出,尾部插入和刪除;隊列是先進先出,尾部插入頭部刪除
C正確:棧只能訪問棧頂元素,不支持隨機訪問,隊列也不支持
D正確:棧和隊列的特性
例題3:
??既然棧兩種線性表示都能實現(xiàn),隊列呢?隊列的鏈表實現(xiàn)我們已經(jīng)實現(xiàn)了,現(xiàn)在我們來看看用順序表實現(xiàn)隊列:
循環(huán)隊列
因為隊列長度有限,所以我們要及時的判斷什么時候隊列滿了。那么怎么判斷隊列是否滿了呢?
如果我們通過隊尾和隊頂是否相等來判斷是否填滿就會發(fā)現(xiàn),在隊列空的時候,隊尾也等于對隊頂。所以我們不能通過這種方法來判斷:
那么我們該如何解決呢?
方法1:
加一個size來計數(shù)
方法2:
多添加一個位置:
空的情況:
滿的情況:
下面我們就以方法2來實現(xiàn)代碼:
typedef struct
{int *a;int front;int rear;int k;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k)
{MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a=(int*)malloc(sizeof(int)*(k+1));obj->k=k;obj->front=obj->rear=0;return obj;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{return obj->rear==obj->front;
}bool myCircularQueueIsFull(MyCircularQueue* obj)
{return (obj->rear+1)%(obj->k+1)==obj->front;
}
//入隊
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
{if(myCircularQueueIsFull(obj))return false;obj->a[obj->rear++]=value;obj->rear%=(obj->k+1);return true;
}
//出隊
bool myCircularQueueDeQueue(MyCircularQueue* obj)
{if(myCircularQueueIsEmpty(obj))return false;++obj->front;obj->front%=(obj->k+1);return true;}int myCircularQueueFront(MyCircularQueue* obj)
{if(myCircularQueueIsEmpty(obj))return -1;return obj->a[obj->front];
}int myCircularQueueRear(MyCircularQueue* obj)
{if(myCircularQueueIsEmpty(obj))return -1;return obj->a[(obj->rear-1+obj->k+1)%(obj->k+1)];
}void myCircularQueueFree(MyCircularQueue* obj)
{free(obj->a);free(obj);
}
這里我們只要關(guān)注這幾點,其他的都很好實現(xiàn):
空的情況:
滿的情況:
??在這里我們學到了如何在數(shù)組里建立循環(huán)!那就是通過mod數(shù)組的長度,就可以使數(shù)組循環(huán)起來!
找隊尾:
??尾部其實就是rear的后面一個元素,即rear-1,但是當rear等于0的時候,-1就會導致越界。對一個正數(shù)加a模a,得到的值不變。對于rear=0的時候進行這個操作就會避免越界的情況。
做完這一題,我們再來看看與這題相關(guān)的選擇題:
例題4:
標準答案:C
隊列適合使用鏈表實現(xiàn),使用順序結(jié)構(gòu)(即固定的連續(xù)空間)實現(xiàn)時會出現(xiàn)假溢出的問題,因此大佬們設(shè)計出了循環(huán)隊列,循環(huán)隊列就是為了解決順序結(jié)構(gòu)實現(xiàn)隊列假溢出問題的
A錯誤:循環(huán)隊列的長度都是固定的
B錯誤:隊頭和隊尾在同一個位置時 隊列可能是空的,也可能是滿的,因此無法判斷
C正確:設(shè)置計數(shù)即添加一個字段來記錄隊列中有效元素的個數(shù),如果隊列中有效元素個數(shù)等于空間總大小時隊列滿,如果隊列中有效元素個數(shù)為0時隊列空
D錯誤:循環(huán)隊列也是隊列的一種,是一種特殊的線性數(shù)據(jù)結(jié)構(gòu)
例題5:
正確答案:B
有效長度一般是rear-front, 但是循環(huán)隊列中rear有可能小于front,減完之后可能是負數(shù),所以需要+N,此時結(jié)果剛好是隊列中有效元素個數(shù),但如果rear大于front,減完之后就是有效元素個數(shù)了,再加N后有效長度會超過N,故需要%N。
總結(jié)
??更新不易,辛苦各位小伙伴們動動小手,👍三連走一走💕💕 ~ ~ ~ 你們真的對我很重要!最后,本文仍有許多不足之處,歡迎各位認真讀完文章的小伙伴們隨時私信交流、批評指正!
專欄訂閱:
每日一題
c語言學習
算法
智力題
初階數(shù)據(jù)結(jié)構(gòu)
更新不易,辛苦各位小伙伴們動動小手,👍三連走一走💕💕 ~ ~ ~ 你們真的對我很重要!最后,本文仍有許多不足之處,歡迎各位認真讀完文章的小伙伴們隨時私信交流、批評指正!