Java數(shù)據(jù)結(jié)構(gòu)與算法之棧(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)
stack,中文翻譯為堆棧,其實(shí)指的是棧,heap,堆。這里講的是數(shù)據(jù)結(jié)構(gòu)的棧,不是內(nèi)存分配里面的堆和棧。
棧是先進(jìn)后出的數(shù)據(jù)的結(jié)構(gòu),好比你碟子一個(gè)一個(gè)堆起來(lái),最后放的那個(gè)是堆在最上面的。
隊(duì)列就是排隊(duì)買蘋果,先去的那個(gè)可以先買。
棧
public class Stack { private int array[]; private int max; private int top; public Stack(int max){ this.max = max; array = new int[max]; top = 0; } public void push(int value){ if(isFull()){ System.out.println("full,can not insert"); return; } array[top++]=value; } public int pop(){ return array[--top]; } public boolean isEmpty(){ if(top == 0){ return true; } return false; } public boolean isFull(){ if(top == max ){ return true; } return false; } public void display(){ while(!isEmpty()){ System.out.println(pop()); } } public static void main(String[] args) { Stack s = new Stack(5); s.push(1); s.push(3); s.push(5); s.push(5); s.push(5); s.display(); } }
其實(shí)還是覺(jué)得設(shè)置top為-1好計(jì)算一點(diǎn),記住這里的i++和++i,如果i=1,那么array[i++]=2,指的是array[1]=2,下次用到i的時(shí)候i的值才會(huì)變2,而++i就是直接使用i=2。
top指向0,因?yàn)槊看味紁ush一個(gè)元素加一,那么添加到最后一個(gè)元素的時(shí)候top=max。由于先進(jìn)后出,那么先出的是最后進(jìn)的,剛剛為top-1所在的位置。
正確輸出:
5
5
5
3
1
一、棧的使用——單詞逆序。
public String reverse(String in){ String out=""; for (int i = 0; i < in.length(); i++) { char c = in.charAt(i); push(c); } while(!isEmpty()){ out+=pop(); } return out; } public static void main(String[] args) { Scanner s = new Scanner(System.in); String string = s.nextLine(); Stack st = new Stack(string.length()); System.out.println(st.reverse(string)); }
將Stack的數(shù)組類型改為char即可。
讀取輸入也可以用IO讀取。
public static void main(String[] args) { InputStreamReader is = new InputStreamReader(System.in); BufferedReader b = new BufferedReader(is); String string=""; try { string = b.readLine(); } catch (IOException e) { e.printStackTrace(); } Stack st = new Stack(string.length()); System.out.println(st.reverse(string)); }
二、棧的使用——分隔符匹配。
public int charat(char c){ for (int i = 0; i < array.length; i++) { if(c == array[i]) return i; } return array.length; } public void match(String in){ String out=""; for (int i = 0; i < in.length(); i++) { char c = in.charAt(i); if(c == '{' || c == '(' || c == '[' ){ push(c); } if(c == '}' || c == ')' || c == ']'){ char temp = pop(); if(c == '}' && temp != '{'|| c == ')' && temp != '('|| c == ']' && temp != ']'){ System.out.println("can not match in "+i); } } } while(!isEmpty()){ char c = pop(); if(c == '{'){ System.out.println("insert } to match "+charat(c)); } if(c == '[' ){ System.out.println("insert ] to match "+charat(c)); } if(c == '(' ){ System.out.println("insert ) to match "+charat(c)); } } } public static void main(String[] args) { Scanner s = new Scanner(System.in); String string = s.nextLine(); Stack st = new Stack(string.length()); st.match(string); } result: klsjdf(klj{lkjjsdf{) can not match in 19 insert } to match 1 insert ) to match 0
將({[先壓入棧,一旦遇到)}]便與彈出的元素比較,若吻合,則匹配。如果一直沒(méi)有)}],最后便會(huì)彈出棧的左符號(hào),提示是在具體哪個(gè)位置,缺少的具體的右符號(hào)類型。
這是可以用棧來(lái)實(shí)現(xiàn)的工具。
棧中數(shù)據(jù)入棧和出棧的時(shí)間復(fù)雜度為常數(shù)O(1),因?yàn)榕c數(shù)據(jù)個(gè)數(shù)無(wú)關(guān),直接壓入彈出,操作時(shí)間短,優(yōu)勢(shì)便在這里,如果現(xiàn)實(shí)生活的使用只需用到先進(jìn)后出的順序而且只用到進(jìn)出數(shù)據(jù)的比較,那就可以使用棧了。
以上所述是小編給大家介紹的Java數(shù)據(jù)結(jié)構(gòu)與算法之棧(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
spring的applicationContext.xml文件與NamespaceHandler解析
這篇文章主要介紹了spring的applicationContext.xml文件與NamespaceHandler解析,Spring容器啟動(dòng),在創(chuàng)建BeanFactory時(shí),需要加載和解析當(dāng)前ApplicationContext對(duì)應(yīng)的配置文件applicationContext.xml,從而獲取bean相關(guān)的配置信息,需要的朋友可以參考下2023-12-12JavaSE程序邏輯控制實(shí)現(xiàn)詳細(xì)圖文教程
JavaSE是為了開發(fā)桌面應(yīng)用程序和控制臺(tái)應(yīng)用程序而設(shè)計(jì)的,使用JavaSE可以編寫?yīng)毩⑦\(yùn)行的Java應(yīng)用程序,這篇文章主要給大家介紹了關(guān)于JavaSE程序邏輯控制實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2024-04-04Spring處理@Async導(dǎo)致的循環(huán)依賴失敗問(wèn)題的方案詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot中的@Async導(dǎo)致循環(huán)依賴失敗的原因及其解決方案,文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下2022-07-07Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法
這篇文章主要介紹了Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01mybatis實(shí)現(xiàn)mapper代理模式的方式
本文向大家講解mybatis的mapper代理模式,以根據(jù)ide值查詢單條數(shù)據(jù)為例編寫xml文件,通過(guò)mapper代理的方式進(jìn)行講解增刪改查,分步驟給大家講解的很詳細(xì),對(duì)mybatis mapper代理模式相關(guān)知識(shí)感興趣的朋友一起看看吧2021-06-06SpringBoot實(shí)現(xiàn)優(yōu)雅停機(jī)的流程步驟
優(yōu)雅停機(jī)(Graceful Shutdown) 是指在服務(wù)器需要關(guān)閉或重啟時(shí),能夠先處理完當(dāng)前正在進(jìn)行的請(qǐng)求,然后再停止服務(wù)的操作,本文給大家介紹了SpringBoot實(shí)現(xiàn)優(yōu)雅停機(jī)的流程步驟,需要的朋友可以參考下2024-03-03