Java數(shù)據(jù)結(jié)構(gòu)與算法之棧(動力節(jié)點Java學(xué)院整理)
stack,中文翻譯為堆棧,其實指的是棧,heap,堆。這里講的是數(shù)據(jù)結(jié)構(gòu)的棧,不是內(nèi)存分配里面的堆和棧。
棧是先進(jìn)后出的數(shù)據(jù)的結(jié)構(gòu),好比你碟子一個一個堆起來,最后放的那個是堆在最上面的。
隊列就是排隊買蘋果,先去的那個可以先買。
棧
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è)置top為-1好計算一點,記住這里的i++和++i,如果i=1,那么array[i++]=2,指的是array[1]=2,下次用到i的時候i的值才會變2,而++i就是直接使用i=2。
top指向0,因為每次都push一個元素加一,那么添加到最后一個元素的時候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
將({[先壓入棧,一旦遇到)}]便與彈出的元素比較,若吻合,則匹配。如果一直沒有)}],最后便會彈出棧的左符號,提示是在具體哪個位置,缺少的具體的右符號類型。
這是可以用棧來實現(xiàn)的工具。
棧中數(shù)據(jù)入棧和出棧的時間復(fù)雜度為常數(shù)O(1),因為與數(shù)據(jù)個數(shù)無關(guān),直接壓入彈出,操作時間短,優(yōu)勢便在這里,如果現(xiàn)實生活的使用只需用到先進(jìn)后出的順序而且只用到進(jìn)出數(shù)據(jù)的比較,那就可以使用棧了。
以上所述是小編給大家介紹的Java數(shù)據(jù)結(jié)構(gòu)與算法之棧(動力節(jié)點Java學(xué)院整理),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
spring的applicationContext.xml文件與NamespaceHandler解析
這篇文章主要介紹了spring的applicationContext.xml文件與NamespaceHandler解析,Spring容器啟動,在創(chuàng)建BeanFactory時,需要加載和解析當(dāng)前ApplicationContext對應(yīng)的配置文件applicationContext.xml,從而獲取bean相關(guān)的配置信息,需要的朋友可以參考下2023-12-12
JavaSE程序邏輯控制實現(xiàn)詳細(xì)圖文教程
JavaSE是為了開發(fā)桌面應(yīng)用程序和控制臺應(yīng)用程序而設(shè)計的,使用JavaSE可以編寫?yīng)毩⑦\(yùn)行的Java應(yīng)用程序,這篇文章主要給大家介紹了關(guān)于JavaSE程序邏輯控制實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2024-04-04
Spring處理@Async導(dǎo)致的循環(huán)依賴失敗問題的方案詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot中的@Async導(dǎo)致循環(huán)依賴失敗的原因及其解決方案,文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下2022-07-07
Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法
這篇文章主要介紹了Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法,本文給大家介紹的非常詳細(xì),具有參考借鑒價值,需要的朋友可以參考下2018-01-01
SpringBoot實現(xiàn)優(yōu)雅停機(jī)的流程步驟
優(yōu)雅停機(jī)(Graceful Shutdown) 是指在服務(wù)器需要關(guān)閉或重啟時,能夠先處理完當(dāng)前正在進(jìn)行的請求,然后再停止服務(wù)的操作,本文給大家介紹了SpringBoot實現(xiàn)優(yōu)雅停機(jī)的流程步驟,需要的朋友可以參考下2024-03-03

