一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你還會(huì)手寫棧和隊(duì)列嗎棧和隊(duì)列的基本實(shí)現(xiàn)程序說明

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:未知 ? 作者:易水寒 ? 2018-11-11 11:34 ? 次閱讀

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

確實(shí),經(jīng)典的數(shù)據(jù)結(jié)構(gòu),包括排序算法,雖然我們平時(shí)不用手寫了,但是這些內(nèi)功,作為開發(fā)人員來說是必須要掌握的。受此啟發(fā),我打算更一下經(jīng)典數(shù)據(jù)結(jié)構(gòu)和算法的系列文章。今天先從棧和隊(duì)列說起。

這些東西,擠地鐵時(shí),吃飯排隊(duì)時(shí),等公交時(shí),可以拿來看看,或者,就把它當(dāng)作個(gè)下午茶吧~

我們知道,在數(shù)組中,若知道數(shù)據(jù)項(xiàng)的下標(biāo),便可立即訪問該數(shù)據(jù)項(xiàng),或者通過順序搜索數(shù)據(jù)項(xiàng),訪問到數(shù)組中的各個(gè)數(shù)據(jù)項(xiàng)。但是棧和隊(duì)列不同,它們的訪問是受限制的,即在特定時(shí)刻只有一個(gè)數(shù)據(jù)項(xiàng)可以被讀取或者被刪除。眾所周知,棧是先進(jìn)后出,只能訪問棧頂?shù)臄?shù)據(jù),隊(duì)列是先進(jìn)先出,只能訪問頭部數(shù)據(jù)。這里不再贅述。

棧的主要機(jī)制可以用數(shù)組來實(shí)現(xiàn),也可以用鏈表來實(shí)現(xiàn),下面用數(shù)組來實(shí)現(xiàn)棧的基本操作:

classArrayStack{

privatelong[] a;

privateint size;//棧數(shù)組的大小

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(){//返回棧頂內(nèi)容,但不刪除

if(isEmpty()){

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

return0;

}

return a[top];

}

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

if(isEmpty()){

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

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("");

}

}

數(shù)據(jù)項(xiàng)入棧和出棧的時(shí)間復(fù)雜度均為O(1)。這也就是說,棧操作所消耗的時(shí)間不依賴于棧中數(shù)據(jù)項(xiàng)的個(gè)數(shù),因此操作時(shí)間很短。棧不需要比較和移動(dòng)操作。

隊(duì)列也可以用數(shù)組來實(shí)現(xiàn),不過這里有個(gè)問題,當(dāng)數(shù)組下標(biāo)滿了后就不能再添加了,但是數(shù)組前面由于已經(jīng)刪除隊(duì)列頭的數(shù)據(jù)了,導(dǎo)致空。所以隊(duì)列我們可以用循環(huán)數(shù)組來實(shí)現(xiàn),見下面的代碼:

publicclassRoundQueue{

privatelong[] a;

privateint size; //數(shù)組大小

privateint nItems;//實(shí)際存儲(chǔ)數(shù)量

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("隊(duì)列已滿");

return;

}

rear =++rear % size;

a[rear]= value;//尾指針滿了就循環(huán)到0處,這句相當(dāng)于下面注釋內(nèi)容

nItems++;

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

rear = -1;

}

a[++rear] = value;

*/

}

publiclong remove(){

if(isEmpty()){

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

return0;

}

nItems--;

front = front % size;

return a[front++];

}

publicvoid display(){

if(isEmpty()){

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

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("隊(duì)列為空!");

return0;

}

return a[front];

}

publicboolean isFull(){

return(nItems == size);

}

publicboolean isEmpty(){

return(nItems ==0);

}

publicint size(){

return nItems;

}

}

和棧一樣,隊(duì)列中插入數(shù)據(jù)項(xiàng)和刪除數(shù)據(jù)項(xiàng)的時(shí)間復(fù)雜度均為O(1)。

還有個(gè)優(yōu)先級隊(duì)列,優(yōu)先級隊(duì)列是比棧和隊(duì)列更專用的數(shù)據(jù)結(jié)構(gòu)。優(yōu)先級隊(duì)列與上面普通的隊(duì)列相比,主要區(qū)別在于隊(duì)列中的元素是有序的,關(guān)鍵字最?。ɑ蛘咦畲螅┑臄?shù)據(jù)項(xiàng)總在隊(duì)頭。數(shù)據(jù)項(xiàng)插入的時(shí)候會(huì)按照順序插入到合適的位置以確保隊(duì)列的順序。優(yōu)先級隊(duì)列的內(nèi)部實(shí)現(xiàn)可以用數(shù)組或者一種特別的樹——堆來實(shí)現(xiàn)。

publicclassPriorityQueue{

privatelong[] a;

privateint size;

privateint nItems;//元素個(gè)數(shù)

publicPriorityQueue(int maxSize){

size = maxSize;

nItems =0;

a =newlong[size];

}

publicvoid insert(long value){

if(isFull()){

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

return;

}

int j;

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

a[nItems++]= value;

}

else{//將數(shù)組中的數(shù)字依照下標(biāo)按照從大到小排列

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("隊(duì)列為空!");

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(" ");

}

}

這里實(shí)現(xiàn)的優(yōu)先級隊(duì)列中,插入操作需要 O(N) 的時(shí)間,而刪除操作則需要 O(1) 的時(shí)間。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4682

    瀏覽量

    94342
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3817

    瀏覽量

    82165
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40525

原文標(biāo)題:如果讓你手寫個(gè)棧和隊(duì)列,你還會(huì)寫嗎?

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C語言|堆棧與隊(duì)列

    堆棧與隊(duì)列都是抽象的數(shù)據(jù)類型,注意堆和不是同一個(gè)概念,這里的堆棧指的是;是一種具有后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),又稱為后進(jìn)先出的線性表,簡稱 LIFO(Last In First Out)
    發(fā)表于 12-26 10:24 ?1057次閱讀

    c++之隊(duì)列

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

    隊(duì)列與C++中的queue詳解

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

    隊(duì)列以后出只有剛開始一組數(shù)出來,后續(xù)的就沒有了,怎么調(diào)了?有償

    隊(duì)列以后出只有剛開始一組數(shù)出來,后續(xù)的就沒有了,怎么調(diào)了?有償
    發(fā)表于 03-13 17:06

    隊(duì)列

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

    java中隊(duì)列的分析

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

    什么是?數(shù)據(jù)結(jié)構(gòu)中如何實(shí)現(xiàn)

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

    教你動(dòng)手寫UDP協(xié)議—DNS報(bào)文解析

    教你動(dòng)手寫UDP協(xié)議系列文章序號(hào)內(nèi)容1《教你動(dòng)手寫UDP協(xié)議-UDP協(xié)議格式》2《教你動(dòng)手寫
    的頭像 發(fā)表于 12-24 16:16 ?1607次閱讀

    深入淺出了解單調(diào)和單調(diào)隊(duì)列

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

    隊(duì)列實(shí)現(xiàn)原理是什么?隊(duì)列實(shí)現(xiàn)方案有哪幾種?

    是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),而隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),兩者原理不難理解,使用也簡單。
    的頭像 發(fā)表于 07-04 13:28 ?2929次閱讀
    <b class='flag-5'>隊(duì)列</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>棧</b>原理是什么?<b class='flag-5'>隊(duì)列</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>棧</b>方案有哪幾種?

    簡述Labview使用隊(duì)列的區(qū)別

    簡述Labview使用隊(duì)列的區(qū)別
    發(fā)表于 01-19 09:50 ?11次下載

    數(shù)據(jù)結(jié)構(gòu)之,隊(duì)列,串介紹

    隊(duì)列不再過多描述,了解入規(guī)則,入隊(duì)出隊(duì)規(guī)則,的遞歸應(yīng)用即可,面試肯定不會(huì)考這種概念,太簡單。
    的頭像 發(fā)表于 05-26 14:35 ?659次閱讀
    數(shù)據(jù)結(jié)構(gòu)之<b class='flag-5'>棧</b>,<b class='flag-5'>隊(duì)列</b>,串介紹

    RTOS消息隊(duì)列的應(yīng)用

    基于RTOS的應(yīng)用中,通常使用隊(duì)列機(jī)制實(shí)現(xiàn)任務(wù)間的數(shù)據(jù)交互,一個(gè)應(yīng)用程序可以有任意數(shù)量的消息隊(duì)列,每個(gè)消息隊(duì)列都有自己的用途。
    發(fā)表于 05-29 10:49 ?751次閱讀
    RTOS消息<b class='flag-5'>隊(duì)列</b>的應(yīng)用

    兩個(gè)實(shí)現(xiàn)一個(gè)隊(duì)列方法

    隊(duì)列是比較基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)。無論在工作中,還是在面試中,隊(duì)列都用的比較多。在計(jì)算機(jī)的世界,會(huì)看到
    的頭像 發(fā)表于 10-08 15:54 ?972次閱讀

    隊(duì)列實(shí)現(xiàn)的兩種方法

    兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè) 思路:兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè),使用了隊(duì)列
    的頭像 發(fā)表于 10-08 16:01 ?838次閱讀