Java集合-Stack
Stack(java.util.Stack)類是典型的棧數(shù)據(jù)結(jié)構(gòu),可以從頭部插入优幸,讀取和移除元素。Stack是List接口的一個(gè)實(shí)現(xiàn),但是很少使用Stack作為L(zhǎng)ist- 除非需要檢查當(dāng)前存儲(chǔ)在Stack中的所有元素胯盯。
注意,Stack類是Vector的子類计露,Vector是java中一個(gè)古老的同步類博脑, 這種同步會(huì)增加對(duì)Stack中所有方法的調(diào)用的開銷。另外票罐,Vector還使用了幾個(gè)古老的java部分(不再推薦)叉趣,支持Iterator的Enumeration ,如果為了避免這種問題可以使用Deque该押。
Stack基礎(chǔ)
Stack這數(shù)據(jù)結(jié)構(gòu)疗杉,是可以在頂部加入元素,并且可以從頂部刪除元素也就是我們說的"后進(jìn)先出 (LIFO)"原子蚕礼,相反的Queue采用的是"先進(jìn)先出(FIFO)"原則烟具,從尾部添加元素,從頭部刪除元素闻牡。
創(chuàng)建Stack
創(chuàng)建 Stack實(shí)例:
Stack stack = new Stack();
使用泛型創(chuàng)建Stack
創(chuàng)建Stack時(shí)可以指定泛型類型:
Stack<String> stack = new Stack<String>();
Stack實(shí)例中只能包含String實(shí)例對(duì)象净赴。
Stack添加元素
創(chuàng)建了Stack實(shí)例,就可以往頂部添加元素罩润,添加的元素必須是Stack對(duì)象玖翅,使用push()方法添加元素:
Stack<String> stack = new Stack<String>();
stack.push("1");
上面例子將String類型的“1”添加到Stack的頂部。
Stack取出并移除元素
如果往Stack中添加了元素割以,則也可以從中取出并移除元素金度,可以使用pop()方法:
Stack<String> stack = new Stack<String>();
stack.push("1");
String topElement = stack.pop();
一旦調(diào)用了pop()方法,則Stack中就不存在此元素了严沥。
從Stack頂部獲取元素
可以調(diào)用Stack的peek() 方法查看Stack的第一個(gè)元素猜极,而且并不移除元素:
Stack<String> stack = new Stack<String>();
stack.push("1");
String topElement = stack.peek();
執(zhí)行代碼后topElement變量的值是“1”,而且還存在中消玄。
搜索Stack中元素的位置
可以通過Stack的search()方法查找元素的位置跟伏,搜索時(shí)使用的是 equals()方法進(jìn)行元素比較,如果元素在頂部則索引位置值為1:
Stack<String> stack = new Stack<String>();
stack.push("1");
stack.push("2");
stack.push("3");
int index = stack.search("3"); //index = 3
Stack的大小
可以通過Stack的size()方法獲取Stack中元素的個(gè)數(shù):
Stack<String> stack = new Stack<String>();
stack.push("1");
stack.push("2");
stack.push("3");
int size = stack.size();
執(zhí)行代碼后 size的值是3翩瓜。
迭代 Stack中的元素
可以通過 Stack的iterator()方法獲取Iterator受扳,對(duì)Stack進(jìn)行迭代:
Stack<String> stack = new Stack<String>();
stack.push("123");
stack.push("456");
stack.push("789");
Iterator iterator = stack.iterator();
while(iterator.hasNext()){
Object value = iterator.next();
}
使用Stream的進(jìn)程Stack
也可以通過Stream Api處理上的元素。首先通過Stream()方法從堆棧獲取流兔跌。一旦從Stack上獲取了Stream勘高,你們就可以迭代:
Stack<String> stack = new Stack<String>();
stack.push("A");
stack.push("B");
stack.push("C");
Stream stream = stack.stream();
stream.forEach((element) -> {
System.out.println(element); // print element
});
使用Stack反轉(zhuǎn)List
可以使用Stack反正List,首先把List中的元素全部添加到中,然后將List清空华望,然后迭代Stack蕊蝗,將Stack中的元素取出并移除添加到List中:
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
System.out.println(list);
Stack<String> stack = new Stack<String>();
while(list.size() > 0) {
stack.push(list.remove(0));
}
while(stack.size() > 0){
list.add(stack.pop());
}
System.out.println(list);
使用Deque作為Stack
可以將Deque作為Stack使用,從頭部添加和取出元素:
Deque<String> dequeAsStack = new ArrayDeque>String>();
dequeAsStack.push("one");
dequeAsStack.push("two");
dequeAsStack.push("three");
String one = dequeAsStack.pop();
String two = dequeAsStack.pop();
String three = dequeAsStack.pop();