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ì)買(mǎi)蘋(píng)果,先去的那個(gè)可以先買(mǎi)。
棧
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)文章
Java中關(guān)于子類覆蓋父類的拋出異常問(wèn)題
今天小編就為大家分享一篇關(guān)于Java中關(guān)于子類覆蓋父類的拋出異常問(wèn)題,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04
IDEA 自帶的數(shù)據(jù)庫(kù)工具真的很牛(收藏版)
這篇文章主要介紹了IDEA 自帶的數(shù)據(jù)庫(kù)工具真的很牛(收藏版),本文以 IntelliJ IDEA/ Mac 版本作為演示,其他版本的應(yīng)該也差距不大,需要的朋友可以參考下2021-04-04
Maven修改運(yùn)行環(huán)境配置代碼實(shí)例
這篇文章主要介紹了Maven修改運(yùn)行環(huán)境配置代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
SpringBoot項(xiàng)目刪除Bean或者不加載Bean的問(wèn)題解決
文章介紹了在Spring Boot項(xiàng)目中如何使用@ComponentScan注解和自定義過(guò)濾器實(shí)現(xiàn)不加載某些Bean的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-01-01
詳解Java中使用ImageIO類對(duì)圖片進(jìn)行壓縮的方法
這篇文章主要介紹了Java中使用ImageIO類對(duì)圖片進(jìn)行壓縮的方法,能夠按指定的比例調(diào)整圖片的寬高,需要的朋友可以參考下2016-04-04
java數(shù)據(jù)結(jié)構(gòu)圖論霍夫曼樹(shù)及其編碼示例詳解
這篇文章主要為大家介紹了java數(shù)據(jù)結(jié)構(gòu)圖論霍夫曼樹(shù)及其編碼示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11
Java常用面板之JScrollPane滾動(dòng)面板實(shí)例詳解
這篇文章主要介紹了Java常用面板JScrollPane的簡(jiǎn)單介紹和一個(gè)相關(guān)實(shí)例,,需要的朋友可以參考下。2017-08-08
java阿拉伯?dāng)?shù)字轉(zhuǎn)中文數(shù)字
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)阿拉伯?dāng)?shù)字轉(zhuǎn)換為中文數(shù)字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04

