天天看點

Java集合-Stack

Stack(

java.util.Stack

)類是典型的棧資料結構,可以從頭部插入,讀取和移除元素。Stack是List接口的一個實作,但是很少使用Stack作為List-

 除非需要檢查目前存儲在Stack中的所有元素。

注意,Stack類是Vector的子類,Vector是java中一個古老的同步類, 這種同步會增加對Stack中所有方法的調用的開銷。另外,Vector還使用了幾個古老的java部分(不再推薦),支援Iterator的Enumeration ,如果為了避免這種問題可以使用Deque。

Stack基礎

Stack

這資料結構,是可以在頂部加入元素,并且可以從頂部删除元素

也就是我們說的"後進先出 (LIFO)"原子,相反的Queue采用的是"先進先出(FIFO)"原則,從尾部添加元素,從頭部删除元素。

建立Stack

建立 

Stack

執行個體:

Stack stack = new Stack();
           

使用泛型建立Stack

建立Stack時可以指定泛型類型:

Stack<String> stack = new Stack<String>();
           

Stack執行個體中隻能包含String執行個體對象。

Stack添加元素

建立了

Stack

執行個體,就可以往頂部添加元素,添加的元素必須是Stack對象,使用

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();
           

一旦調用了pop()方法,則Stack中就不存在此元素了。

從Stack頂部擷取元素

可以調用

Stack

peek()

 方法檢視Stack的第一個元素,而且并不移除元素:

Stack<String> stack = new Stack<String>();

stack.push("1");

String topElement = stack.peek();
           

執行代碼後

topElement

變量的值是“1”,而且還存在中。

搜尋Stack中元素的位置

可以通過Stack的

search()

方法查找元素的位置,搜尋時使用的是

equals()

方法進行元素比較,如果元素在頂部則索引位置值為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中元素的個數:

Stack<String> stack = new Stack<String>();

stack.push("1");
stack.push("2");
stack.push("3");

int size = stack.size();
           

執行代碼後 

size

的值是3。

疊代 Stack中的元素

可以通過 

Stack

的iterator()方法擷取

Iterator,對Stack進行疊代:

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的程序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反轉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();
           

參考:

http://tutorials.jenkov.com/java-collections/stack.html

       https://blog.csdn.net/cgsyck/article/details/108580298

       https://blog.csdn.net/cgsyck/article/details/108347596