精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

你還會手寫棧和隊列嗎棧和隊列的基本實現程序說明

算法與數據結構 ? 來源:未知 ? 作者:易水寒 ? 2018-11-11 11:34 ? 次閱讀

昨天跟一個CSDN上的朋友聊天,他說現在如果讓他自己手寫一個棧或者隊列,估計都要寫蠻久的,平時雖然都在用,但是都是別人封裝好的集合。

確實,經典的數據結構,包括排序算法,雖然我們平時不用手寫了,但是這些內功,作為開發人員來說是必須要掌握的。受此啟發,我打算更一下經典數據結構和算法的系列文章。今天先從棧和隊列說起。

這些東西,擠地鐵時,吃飯排隊時,等公交時,可以拿來看看,或者,就把它當作個下午茶吧~

我們知道,在數組中,若知道數據項的下標,便可立即訪問該數據項,或者通過順序搜索數據項,訪問到數組中的各個數據項。但是棧和隊列不同,它們的訪問是受限制的,即在特定時刻只有一個數據項可以被讀取或者被刪除。眾所周知,棧是先進后出,只能訪問棧頂的數據,隊列是先進先出,只能訪問頭部數據。這里不再贅述。

棧的主要機制可以用數組來實現,也可以用鏈表來實現,下面用數組來實現棧的基本操作:

classArrayStack{

privatelong[] a;

privateint size;//棧數組的大小

privateint top;//棧頂

publicArrayStack(int maxSize){

this.size = maxSize;

this.a =newlong[size];

this.top =-1;//表示空棧

}

publicvoid push(long value){//入棧

if(isFull()){

System.out.println("棧已滿!");

return;

}

a[++top]= value;

}

publiclong peek(){//返回棧頂內容,但不刪除

if(isEmpty()){

System.out.println("棧中沒有數據");

return0;

}

return a[top];

}

publiclong pop(){//彈出棧頂內容,刪除

if(isEmpty()){

System.out.println("棧中沒有數據!");

return0;

}

return a[top--];

}

publicint size(){

return top +1;

}

publicboolean isEmpty(){

return(top ==-1);

}

publicboolean isFull(){

return(top == size -1);

}

publicvoid display(){

for(int i = top; i >=0; i--){

System.out.print(a[i]+" ");

}

System.out.println("");

}

}

數據項入棧和出棧的時間復雜度均為O(1)。這也就是說,棧操作所消耗的時間不依賴于棧中數據項的個數,因此操作時間很短。棧不需要比較和移動操作。

隊列也可以用數組來實現,不過這里有個問題,當數組下標滿了后就不能再添加了,但是數組前面由于已經刪除隊列頭的數據了,導致空。所以隊列我們可以用循環數組來實現,見下面的代碼:

publicclassRoundQueue{

privatelong[] a;

privateint size; //數組大小

privateint nItems;//實際存儲數量

privateint front;//頭

privateint rear; //尾

publicRoundQueue(int maxSize){

this.size = maxSize;

a =newlong[size];

front =0;

rear =-1;

nItems =0;

}

publicvoid insert(long value){

if(isFull()){

System.out.println("隊列已滿");

return;

}

rear =++rear % size;

a[rear]= value;//尾指針滿了就循環到0處,這句相當于下面注釋內容

nItems++;

/* if(rear == size-1){

rear = -1;

}

a[++rear] = value;

*/

}

publiclong remove(){

if(isEmpty()){

System.out.println("隊列為空!");

return0;

}

nItems--;

front = front % size;

return a[front++];

}

publicvoid display(){

if(isEmpty()){

System.out.println("隊列為空!");

return;

}

int item = front;

for(int i =0; i < nItems; i++){

System.out.print(a[item++% size]+" ");

}

System.out.println("");

}

publiclong peek(){

if(isEmpty()){

System.out.println("隊列為空!");

return0;

}

return a[front];

}

publicboolean isFull(){

return(nItems == size);

}

publicboolean isEmpty(){

return(nItems ==0);

}

publicint size(){

return nItems;

}

}

和棧一樣,隊列中插入數據項和刪除數據項的時間復雜度均為O(1)。

還有個優先級隊列,優先級隊列是比棧和隊列更專用的數據結構。優先級隊列與上面普通的隊列相比,主要區別在于隊列中的元素是有序的,關鍵字最小(或者最大)的數據項總在隊頭。數據項插入的時候會按照順序插入到合適的位置以確保隊列的順序。優先級隊列的內部實現可以用數組或者一種特別的樹——堆來實現。

publicclassPriorityQueue{

privatelong[] a;

privateint size;

privateint nItems;//元素個數

publicPriorityQueue(int maxSize){

size = maxSize;

nItems =0;

a =newlong[size];

}

publicvoid insert(long value){

if(isFull()){

System.out.println("隊列已滿!");

return;

}

int j;

if(nItems ==0){//空隊列直接添加

a[nItems++]= value;

}

else{//將數組中的數字依照下標按照從大到小排列

for(j = nItems-1; j >=0; j--){

if(value > a[j]){

a[j+1]= a[j];

}

else{

break;

}

}

a[j+1]= value;

nItems++;

}

}

publiclong remove(){

if(isEmpty()){

System.out.println("隊列為空!");

return0;

}

return a[--nItems];

}

publiclong peekMin(){

return a[nItems-1];

}

publicboolean isFull(){

return(nItems == size);

}

publicboolean isEmpty(){

return(nItems ==0);

}

publicint size(){

return nItems;

}

publicvoid display(){

for(int i = nItems-1; i >=0; i--){

System.out.print(a[i]+" ");

}

System.out.println(" ");

}

}

這里實現的優先級隊列中,插入操作需要 O(N) 的時間,而刪除操作則需要 O(1) 的時間。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4601

    瀏覽量

    92673
  • 程序
    +關注

    關注

    116

    文章

    3778

    瀏覽量

    80860
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40095

原文標題:如果讓你手寫個棧和隊列,你還會寫嗎?

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言|堆棧與隊列

    堆棧與隊列都是抽象的數據類型,注意堆和不是同一個概念,這里的堆棧指的是是一種具有后進先出的數據結構,又稱為后進先出的線性表,簡稱 LIFO(Last In First Out)
    發表于 12-26 10:24 ?918次閱讀

    c++之隊列

    stack ,(堆棧),是一種先進后出(First In Last Out,FILO)的數據結構,先插入的數據在底,后放入的數據在頂,所有的數據只能從頂取出。
    的頭像 發表于 07-15 08:50 ?901次閱讀
    c++之<b class='flag-5'>棧</b>和<b class='flag-5'>隊列</b>

    隊列與C++中的queue詳解

    隊列就是一種線性的數據結構,它與日常生活中排隊的隊列相似,即先進先出(LIFO, First In First Out),這點也是它與(Stack)的最大不同之處。
    的頭像 發表于 07-18 17:31 ?1615次閱讀
    <b class='flag-5'>隊列</b>與C++中的queue詳解

    隊列以后出只有剛開始一組數出來,后續的就沒有了,怎么調了?有償

    隊列以后出只有剛開始一組數出來,后續的就沒有了,怎么調了?有償
    發表于 03-13 17:06

    隊列

    隊列:1、隊列定義:限定僅只能在表尾端進行插入和刪除的線性表。頂:表尾端被稱之為頂。
    發表于 08-13 13:50 ?0次下載

    java中隊列的分析

    《p》《/p》《p》的英文單詞是Stack,它代表一種特殊的線性表,這種線性表只能在固定一端(通常認為是線性表的尾端)進行插入,刪除操作。《/p》《p》的基本定義《/p》《p》
    發表于 09-28 15:38 ?0次下載

    什么是?數據結構中如何實現

    今天放松一下,我們來看看數據結構中的,這節的知識點可以說是數據結構中最容易上手的知識點了,其實比起鏈表,其實鏈表也有隊列的模型,鏈表的頭插其實就是后進先出,鏈表的尾插其實就是先進先出,這不
    發表于 04-29 18:25 ?0次下載
    什么是<b class='flag-5'>棧</b>?數據結構中<b class='flag-5'>棧</b>如何<b class='flag-5'>實現</b>

    教你動手寫UDP協議—DNS報文解析

    教你動手寫UDP協議系列文章序號內容1《教你動手寫UDP協議-UDP協議格式》2《教你動手寫
    的頭像 發表于 12-24 16:16 ?1388次閱讀

    深入淺出了解單調和單調隊列

    內單調遞增或單調遞減的內元素是有序的,單調隊列同樣也是。 下面我們通過幾個題目由淺入深,一點一點挖透他們吧! 提綱 單調隊列 劍指
    的頭像 發表于 02-02 10:18 ?1452次閱讀
    深入淺出了解單調<b class='flag-5'>棧</b>和單調<b class='flag-5'>隊列</b>

    隊列實現原理是什么?隊列實現方案有哪幾種?

    是一種后進先出的數據結構,而隊列是一種先進先出的數據結構,兩者原理不難理解,使用也簡單。
    的頭像 發表于 07-04 13:28 ?2713次閱讀
    <b class='flag-5'>隊列</b><b class='flag-5'>實現</b><b class='flag-5'>棧</b>原理是什么?<b class='flag-5'>隊列</b><b class='flag-5'>實現</b><b class='flag-5'>棧</b>方案有哪幾種?

    簡述Labview使用隊列的區別

    簡述Labview使用隊列的區別
    發表于 01-19 09:50 ?9次下載

    數據結構之隊列,串介紹

    隊列不再過多描述,了解入規則,入隊出隊規則,的遞歸應用即可,面試肯定不會考這種概念,太簡單。
    的頭像 發表于 05-26 14:35 ?498次閱讀
    數據結構之<b class='flag-5'>棧</b>,<b class='flag-5'>隊列</b>,串介紹

    RTOS消息隊列的應用

    基于RTOS的應用中,通常使用隊列機制實現任務間的數據交互,一個應用程序可以有任意數量的消息隊列,每個消息隊列都有自己的用途。
    發表于 05-29 10:49 ?618次閱讀
    RTOS消息<b class='flag-5'>隊列</b>的應用

    兩個實現一個隊列方法

    隊列是比較基礎的數據結構。無論在工作中,還是在面試中,隊列都用的比較多。在計算機的世界,會看到
    的頭像 發表于 10-08 15:54 ?781次閱讀

    隊列實現的兩種方法

    兩個隊列實現一個 思路:兩個隊列實現一個,使用了隊列
    的頭像 發表于 10-08 16:01 ?627次閱讀