㈠ C++怎麼用隊列存儲數據
#include <stdio.h>
#include <stdlib.h>
typedef int elemType;
strUCt sNode{
elemType data; /* 值域 */
struct sNode *next; /* 鏈接指針 */
};
struct queueLK{
struct sNode *front; /* 隊首指針 */
struct sNode *rear; /* 隊尾指針 */
};
/* 1.初始化鏈隊 */
void initQueue(struct queueLK *hq)
{
hq->front = hq->rear = NULL; /* 把隊首和隊尾指針置空 */
return;
}
/* 2.向鏈隊中插入一個元素x */
void enQueue(struct queueLK *hq, elemType x)
{
/* 得到一個由newP指針所指向的新結點 */
struct sNode *newP;
newP = malloc(sizeof(struct sNode));
if(newP == NULL){
printf("內存空間分配失敗! ");
exit(1);
}
/* 把x的值賦給新結點的值域,把新結點的指針域置空 */
newP->data = x;
newP->next = NULL;
/* 若鏈隊為空,則新結點即是隊首結點又是隊尾結點 */
if(hq->rear == NULL){
hq->front = hq->rear = newP;
}else{ /* 若鏈隊非空,則依次修改隊尾結點的指針域和隊尾指針,使之指向新的隊尾結點 */
hq->rear = hq->rear->next = newP; /* 注重賦值順序哦 */
}
return;
}
/* 3.從隊列中刪除一個元素 */
elemType outQueue(struct queueLK *hq)
{
struct sNode *p;
elemType temp;
/* 若鏈隊為空則停止運行 */
if(hq->front == NULL){
printf("隊列為空,無法刪除! ");
exit(1);
}
temp = hq->front->data; /* 暫存隊尾元素以便返回 */
p = hq->front; /* 暫存隊尾指針以便回收隊尾結點 */
hq->front = p->next; /* 使隊首指針指向下一個結點 */
/* 若刪除後鏈隊為空,則需同時使隊尾指針為空 */
if(hq->front == NULL){
hq->rear = NULL;
}
free(p); /* 回收原隊首結點 */
return temp; /* 返回被刪除的隊首元素值 */
}
/* 4.讀取隊首元素 */
elemType peekQueue(struct queueLK *hq)
{
/* 若鏈隊為空則停止運行 */
if(hq->front == NULL){
printf("隊列為空,無法刪除! ");
exit(1);
}
return hq->front->data; /* 返回隊首元素 */
}
㈡ 設循環隊列的存儲空間為Q(1:35),初始狀態為front=rear=35.現經過一系列入隊與退隊運算後,
答案是0或35。前提條件是:此循環隊列的存儲空間全部用於存儲數據,而沒有留出一個存儲空間用於判別隊滿與隊空。
在上述循環隊列中,當front = rear時,
(1)有可能是隊空:先入隊15個元素,rear = 15;再出隊15個元素,front = 15。
(2)有可能是隊滿:先入隊15個元素,rear = 15;再出隊15個元素,front =
15;最後再入隊35個元素,rear指針循環一圈後再次等於15。
綜上,隊列中元素個數為0或35。
但應注意,上述的循環隊列由於無法判別隊滿與隊空,導致其產生二義性(即有歧義),可用性降低。因此,改進的方法是少用一個存儲空間,即隊列最大隻存儲34個元素,此時可用下列方法區分隊滿與隊空:
(1)隊滿:(rear + 1)% MaxSize == front
(2)隊空:rear == front
㈢ 如何保存隊列信息
存到txt里就可以了
㈣ 棧和隊列的存儲方式
棧和隊列都是在一個特定范圍的存儲單元中存儲的數據,這些數據都可以重新被取出使用。不同的是,棧就象一個很窄的桶先存進去的數據只能最後才能取出來,而且隊列則不一樣,即「先進後出」。隊列有點象日常排隊買東西的人的「隊列」先牌隊的人先買,後排隊的人後買,即「先進先出」。有時在數據結構中還有可能出現按照大小排隊或按照一定條件排隊的數據隊列,這時的隊列屬於特殊隊列,就不一定按照「先進先出」的原則讀取數據了。
㈤ 消息隊列會把消息 存儲到哪裡
消息隊列由內核創建,所以最後的數據存放在內核中,並由內核維護!
㈥ 隊列怎麼存儲與實現PASCAL
由於在普通隊列中尾指針在追上首指針後可能會造成隊列前端空虛而隊列卻上溢,所以引入循環隊列充分利用空間,為了區別隊列空和滿,改用隊尾追上隊首指針來標記滿,缺點是浪費一個貯存空間
㈦ 隊列的兩種存儲方式對比
隊列的兩種存儲方式分為消息投遞實時性:使用短輪詢方式,實時性取決於輪詢間隔時間:使用長輪詢,同寫入實時性一致,消息的寫入延時通常在幾個毫秒。總結:短輪詢:周期性的向服務提供方發起請求,獲取數據優點:前後端程序編寫比較容易。缺點:請求中有大半是無用,難於維護,浪費帶寬和伺服器資源;響應的結果沒有順序(因為是非同步請求,當發送的請求沒有返回結果的時候,後面的請求又被發送。而此時如果後面的請求比前面的請 求要先返回結果,那麼當前面的請求返回結果數據時已經是過時無效的數據了)。長輪詢:客戶端向伺服器發送請求,伺服器接到請求後保持住連接,直到有新消息才返回響應信息並關閉連接,客戶端處理完響應信息後再向伺服器發送新的請求。優點:在無消息的情況下不會頻繁的請求,耗費資源小。缺點:伺服器hold連接會消耗資源,難於管理維護。消費失敗重試Kafka:消費失敗不支持重試RocketMQ:消費失敗支持定時重試,每次重試間隔時間順延總結:kafka也可以通過編寫代碼來實現寫入和消費失敗的重試機制,這種要求需要用戶來編寫代碼實現,kafka只是提供了這種方式,但並不是他推薦的使用方式,他的設計模式上只是兼顧了這種情況,並不是重點。RocketMQ在設計上就考慮了這種情況,在提供的官方api中提供了重試的設置,用戶可以選擇多種模式的重試機制,以及自定義的重試邏輯,簡單場景下用戶只用設置一下參數即可。關於需要重試的場景例如充值類應用,當前時刻調用運營商網關,充值失敗,可能是對方壓力過多,稍後在調用就會成功,如支付寶到銀行扣款也是類似需求。這里的重試需要可靠的重試,即失敗重試的消息不因為Consumer宕機導致丟失。
㈧ 循環隊列採用的是順序存儲方式還是鏈式存儲方式
是的····順序存儲就是指用一組連續的存儲單元依次存儲,鏈式存儲內存中地址不是挨著的,循環隊列增設了兩個指針頭指針和尾指針,實現空間的最大利用
㈨ 隊列通常採用兩種存儲結構是
應該是順序存儲和鏈接存儲,通稱順序隊列和鏈隊列,其中順序隊列一般用的是循環隊列的方式
㈩ 循環隊列的存儲空間為Q(1:30)是什麼意思
就是Q存儲隊列元素用的數組下標為1~30。
等於0的話這兩個就是空指針了,而且隊列的創建需要用到循環語句不斷分配內存的,開始時頭尾指針應該同時指向隊列中第一個元素的內存空間。
此循環隊列的存儲空間全部用於存儲數據,而沒有留出一個存儲空間用於判別隊滿與隊空。
在上述循環隊列中,當front
=
rear時,
(1)有可能是隊空:先入隊15個元素,rear
=
15;再出隊15個元素,front
=
15。
(2)有可能是隊滿:先入隊15個元素,rear
=
15;再出隊15個元素,front
=
15;最後再入隊35個元素,rear指針循環一圈後再次等於15。
綜上,隊列中元素個數為0或35。
(10)隊列存儲擴展閱讀:
在循環隊列中,當隊列為空時,有front=rear,而當所有隊列空間全占滿時,也有front=rear。為了區別這兩種情況,規定循環隊列最多隻能有MaxSize-1個隊列元素,當循環隊列中只剩下一個空存儲單元時,隊列就已經滿了。因此,隊列判空的條件是front=rear,而隊列判滿的條件是front=(rear+1)%MaxSize。
在循環隊列結構中,當存儲空間的最後一個位置已被使用而再要進入隊運算時,只需要存儲空間的第一個位置空閑,便可將元素加入到第一個位置,即將存儲空間的第一個位置作為隊尾。循環隊列可以更簡單防止偽溢出的發生,但隊列大小是固定的。
參考資料來源:網路-循環隊列