在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

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

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

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

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

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

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

棧的主要機(jī)制可以用數(shù)組來(lái)實(shí)現(xiàn),也可以用鏈表來(lái)實(shí)現(xiàn),下面用數(shù)組來(lái)實(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("棧中沒(méi)有數(shù)據(jù)");

return0;

}

return a[top];

}

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

if(isEmpty()){

System.out.println("棧中沒(méi)有數(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)。這也就是說(shuō),棧操作所消耗的時(shí)間不依賴于棧中數(shù)據(jù)項(xiàng)的個(gè)數(shù),因此操作時(shí)間很短。棧不需要比較和移動(dòng)操作。

隊(duì)列也可以用數(shù)組來(lái)實(shí)現(xiàn),不過(guò)這里有個(gè)問(wèn)題,當(dāng)數(shù)組下標(biāo)滿了后就不能再添加了,但是數(shù)組前面由于已經(jīng)刪除隊(duì)列頭的數(shù)據(jù)了,導(dǎo)致空。所以隊(duì)列我們可以用循環(huán)數(shù)組來(lái)實(shí)現(xiàn),見(jià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)先級(jí)隊(duì)列,優(yōu)先級(jí)隊(duì)列是比棧和隊(duì)列更專用的數(shù)據(jù)結(jié)構(gòu)。優(yōu)先級(jí)隊(duì)列與上面普通的隊(duì)列相比,主要區(qū)別在于隊(duì)列中的元素是有序的,關(guān)鍵字最?。ɑ蛘咦畲螅┑臄?shù)據(jù)項(xiàng)總在隊(duì)頭。數(shù)據(jù)項(xiàng)插入的時(shí)候會(huì)按照順序插入到合適的位置以確保隊(duì)列的順序。優(yōu)先級(jí)隊(duì)列的內(nèi)部實(shí)現(xiàn)可以用數(shù)組或者一種特別的樹(shù)——堆來(lái)實(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)先級(jí)隊(duì)列中,插入操作需要 O(N) 的時(shí)間,而刪除操作則需要 O(1) 的時(shí)間。

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

    關(guān)注

    23

    文章

    4660

    瀏覽量

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

    關(guān)注

    117

    文章

    3815

    瀏覽量

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

    關(guān)注

    3

    文章

    573

    瀏覽量

    40417

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

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

收藏 0人收藏

    評(píng)論

    相關(guān)推薦

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

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

    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 ?1183次閱讀
    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 ?1958次閱讀
    <b class='flag-5'>隊(duì)列</b>與C++中的queue詳解

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

    隊(duì)列以后出只有剛開(kāi)始一組數(shù)出來(lái),后續(xù)的就沒(méi)有了,怎么調(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)

    今天放松一下,我們來(lái)看看數(shù)據(jù)結(jié)構(gòu)中的,這節(jié)的知識(shí)點(diǎn)可以說(shuō)是數(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)手寫(xiě)UDP協(xié)議—DNS報(bào)文解析

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

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

    內(nèi)單調(diào)遞增或單調(diào)遞減的,內(nèi)元素是有序的,單調(diào)隊(duì)列同樣也是。 下面我們通過(guò)幾個(gè)題目由淺入深,一點(diǎn)一點(diǎn)挖透他們吧! 提綱 單調(diào)隊(duì)列 劍指
    的頭像 發(fā)表于 02-02 10:18 ?1588次閱讀
    深入淺出了解單調(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),兩者原理不難理解,使用也簡(jiǎn)單。
    的頭像 發(fā)表于 07-04 13:28 ?2891次閱讀
    <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>方案有哪幾種?

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

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

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

    隊(duì)列不再過(guò)多描述,了解入規(guī)則,入隊(duì)出隊(duì)規(guī)則,的遞歸應(yīng)用即可,面試肯定不會(huì)考這種概念,太簡(jiǎn)單。
    的頭像 發(fā)表于 05-26 14:35 ?632次閱讀
    數(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 ?723次閱讀
    RTOS消息<b class='flag-5'>隊(duì)列</b>的應(yīng)用

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

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

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

    兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè) 思路:兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè),使用了隊(duì)列
    的頭像 發(fā)表于 10-08 16:01 ?791次閱讀
    主站蜘蛛池模板: 特黄特色大片免费播放路01 | 亚洲国产精品第一区二区 | 久久天天躁狠狠躁夜夜爽 | 一级片特黄 | 国产午夜毛片一区二区三区 | 复古毛片 | 狠狠狠狠狠狠狠狠 | 欧美爽爽| 手机看片免费永久在线观看 | 一级毛片视频在线 | 国产一二三区在线观看 | 男操女视频在线观看 | 国产一区国产二区国产三区 | 伊人久久综合成人网小说 | 男人你懂的在线观看视频 | 欧美三级中文字幕hd | 国产三级香港三级人妇 | 2021久久精品99精品久久 | 一级做a爱免费观看视频 | 黄色三级国产 | 久久久噜噜噜久久中文字幕色伊伊 | 国产性videostv另类极品 | 欧美国产在线一区 | 91久久精品青青草原伊人 | 一本在线免费视频 | 濑亚美莉iptd619在线观看 | 四虎最新免费观看网址 | 伊人婷婷涩六月丁香七月 | 视色4setv.com | 天天操夜夜爱 | 噜噜色噜噜 | 91大神亚洲影视在线 | 激情五月婷婷丁香 | 自偷自拍亚洲欧美清纯唯美 | 68日本xxxxxxxxx xx| 两性色午夜视频免费播放 | 国产午夜毛片一区二区三区 | 一区二区三区中文国产亚洲 | 午夜视频免费在线播放 | 成人在线网站 | 一区二区影视 |

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品