佇列的特別實現

2021-07-27 00:09:06 字數 1699 閱讀 8596

採用前文中的改進方式會讓佇列的實現變得複雜,現在採用棧的方式來實現佇列。

如下圖所示:

實現思路:

1、準備兩個棧用於實現佇列:instack和outstack

2、當有新元素入隊時:將其壓入instack中

3、當需要出隊時:

當outstack為空時:

當outstack不為空時:

//特殊佇列 標頭檔案 specialqueue.h

#ifndef _squeue_h_

#define _squeue_h_

typedef

void squeue;

squeue* squeue_create();

void squeue_destroy(squeue* queue);

void squeue_clear(squeue* queue);

void* squeue_retrieve(squeue* queue);

void* squeue_header(squeue* queue);

int squeue_length(squeue* queue);

#endif

//特殊佇列 原始檔 specialqueue.c

#include

#include

#include

"linkstack.h"

#include

"squeue.h"

typedef struct _tag_squeue

tsqueue;

squeue* squeue_create() // o(1) 建立特殊佇列

}

return ret;

}void squeue_destroy(squeue*

queue) // o(n)

void squeue_clear(squeue*

queue) // o(n)

}queue, void

* item) // o(1) 資料進入佇列

}void

* squeue_retrieve(squeue*

queue) // o(1) 出佇列

//最壞情況下o(n),需要看平均情況,每個元素都要壓入in出in壓入out出out,平均情況為o(1)

}ret = linkstack_pop(squeue->outstack);//out棧的資料出棧

}

return ret;

}void

* squeue_header(squeue*

queue) // o(1)與出佇列的**相同

}ret = linkstack_top(squeue->outstack);

} return ret;

}int squeue_length(squeue*

queue) // o(1)

return ret;

}

組合使用兩個棧的「後進先出」可以實現佇列的「先進先出」。

兩個棧實現佇列的方法復用棧資料結構,實現過程簡單且高效。

兩個棧實現的佇列其操作的時間複雜度能夠達到o(1)。

佇列實現 佇列的鏈式結構實現

佇列的實現,用單鏈表實現佇列的結構 1 初始化建立佇列 2 釋放佇列 3 清空佇列 4 計算佇列長度 5 判斷佇列是否為空 6 列印佇列元素 7 入隊操作 隊尾插入 8 出隊操作 隊首刪除 include typedef int datatype struct qnode struct lqueue...

佇列的實現(一)順序佇列的實現

佇列 只能一端進行出棧一端進行進棧。隊首 只允許進行出棧操作,可以進行刪除。隊尾 只允許進行入棧操作,可以進行插入。隊尾進,隊尾出,先進先出。所以佇列的實現也有兩種形式,一種是陣列實現佇列,一種是用鍊錶實現佇列。首先是用陣列來實現佇列。使用陣列佇列,因為在刪除時front會越來越大,所以最後會出現一...

佇列 迴圈佇列的實現

為了可以重新利用佇列底層陣列中已刪除元素所佔的空間,消除可能出現的 假滿 現象,將順序佇列改進為迴圈佇列。迴圈佇列是首尾相連的佇列 當front rear變數達到底層陣列的capacity 1之後,再向前以為就變成0.入隊 1 判斷佇列是否已滿,已滿丟擲越界異常 2 不滿的話把元素查到隊尾,並且re...