Java集合-Stack

Stackjava.util.Stack)类是典型的栈数据结构,可以从头部插入,读取和移除元素。Stack是List接口的一个实现,但是很少使用Stack作为List- 除非需要检查当前存储在Stack中的所有元素。

注意,Stack类是Vector的子类,Vectorjava中一个古老的同步类, 这种同步会增加对Stack中所有方法的调用的开销。另外,Vector还使用了几个古老的java部分(不再推荐),支持IteratorEnumeration ,如果为了避免这种问题可以使用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顶部获取元素

可以调用Stackpeek() 方法查看Stack的第一个元素,而且并不移除元素:

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

stack.push("1");

String topElement = stack.peek();

 

执行代码后topElement变量的值是“1”,而且还存在中。

搜索Stack中元素的位置

可以通过Stacksearch()方法查找元素的位置,搜索时使用的是 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的大小

可以通过Stacksize()方法获取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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java集合中的`Stack`类是基于后进先出(LIFO)原则的数据结构。它继承自`Vector`类,并提供了一些额外的方法用于实现堆栈操作。 要使用`Stack`类,首先需要导入`java.util.Stack`包。然后可以创建一个`Stack`对象并开始进行堆栈操作。 以下是一个简单的示例代码,展示了如何使用`Stack`类: ```java import java.util.Stack; public class StackExample { public static void main(String[] args) { // 创建一个空的堆栈 Stack<String> stack = new Stack<>(); // 压入元素到堆栈stack.push("Java"); stack.push("C++"); stack.push("Python"); // 查看堆栈顶部的元素 String topElement = stack.peek(); System.out.println("Top element: " + topElement); // 弹出堆栈顶部的元素 String poppedElement = stack.pop(); System.out.println("Popped element: " + poppedElement); // 判断堆栈是否为空 boolean isEmpty = stack.isEmpty(); System.out.println("Is stack empty? " + isEmpty); // 获取堆栈的大小 int size = stack.size(); System.out.println("Stack size: " + size); } } ``` 上述代码首先创建了一个空的`Stack`对象,然后通过`push()`方法将一些字符串压入堆栈中。使用`peek()`方法可以查看堆栈顶部的元素,而`pop()`方法可以弹出堆栈顶部的元素。`isEmpty()`方法用于判断堆栈是否为空,`size()`方法可以获取堆栈的大小。 运行上述代码,你会看到以下输出: ``` Top element: Python Popped element: Python Is stack empty? false Stack size: 2 ``` 这只是`Stack`类的基本用法示例,你还可以使用其他方法来处理堆栈中的元素。希望能对你有所帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值