「java栈peek()」java栈peek
本篇文章给大家谈谈java栈peek(),以及java栈peek对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
c++ cin.peek() 在java怎么用
C++ cin严格说可以对应new DataInputStream(System.in);
但用new Scanner(System.in);更方便普遍。
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();//输入一个整数。
String t=sc.next();//输入一行字符。
ArrayDeque
写cs61b题目时惊叹为什么会有这种东西,于是搜索了一番,发现这容器还是很有意思的,于是搬运了一下。
参考: ArrayDeque - (jianshu.com)
Java ArrayDeque - Java教程 - 菜鸟教程 (cainiaojc.com)
在ArrayDeque类实现这两个接口:Java Queue和Java Deque
使用了数组来存储数据,同时用两个int值 head 和 tail 来表示头部和尾部。不过需要注意的是 tail 并不是尾部元素的索引,而是尾部元素的 下一位 ,即下一个将要被加入的元素的索引。
ArrayDeque 有三个构造函数来初始化,除了无参的构造函数使用了默认容量,其它两个构造函数会通过 allocateElements 函数来计算初始容量
数组的大小很特殊,大小必为2的n次方(2^n)。下面我们看看 allocateElements 方法
(1)对于一个小于2^30的值,经过五次右移和位或操作后,可以得到一个 2^k - 1 的值。最后再将这个值 +1 ,得到 2^k 。通过这个方法,可以将一个任意的初始值转化为2^n的值.
(2)不过有一点不足在于,如果本身传进来的值就是 2^n 的值,那么经过转化会变成 2^(n+1) ,所以我们在不用刻意去传入 2^n 的值。
(3)如果传入的值大于等于 2^30 ,那么经过转化会变成负值,即 0,此时会把初始值设置为 2^30 ,即最大的容量只有 2^30
在ArrayDeque中,数组是作为环形来使用的,正常情况下在末尾添加元素后,tail=tail+1是要判断是否越界,如果越界,会变为从索引0开始。参考如下图片,当H添加到索引7后,tail值会+1,此时tail=8,但是越界了,所以应该将tail设置为0。
我们看看 tail = (tail + 1) (elements.length - 1) 的正确性:
所以当 tail+1 = length - 1 ,此时数组并没有越界, (tail + 1) (elements.length - 1) 后得到的还是 tail+1 。如果 tail + 1 = length ,此时数组越界了, (tail + 1) (elements.length - 1) 后得到0。
所以通过 (tail + 1) (elements.length - 1) 可以跳过条件判断在环形数组中获取正确的索引值,然后再判断新的 tail 是否等于 head ,如果结果为 true ,那么数组已经满了,需要扩容,即 doubleCapacity() 。
原理和addLast相同
无论是从头部还是从尾部添加元素,都会判断 tail==head ,如果两个索引相遇,说明数组空间已满,需要扩容操作.
ArrayDeque支持从头尾两端移除元素
在上文中,我们讲了怎么去实现一个ArrayDeque,但Java标准库中已经为我们准备好了,我们只需按规则使用就行
add() - 将指定的元素插入ArrayDeque双端队列的 末尾
addFirst() -在ArrayDeque双端队列的 开头 ,插入指定的元素
addLast() - 在ArrayDeque双端队列的 末尾 插入指定的内容(等效于 add() )
注意:如果ArrayDeque双端队列已满,则所有这些方法 add() , addFirst() 和 addLast() 都会引发IllegalStateException
offer() - 将指定的元素插入ArrayDeque双端队列的 末尾
offerFirst() - 在ArrayDeque双端队列的 开始处 插入指定的元素
offerLast() - 将指定的元素插入ArrayDeque双端队列的 末尾
注意: offer(),offerFirst()并offerLast()返回true是否成功插入元素;否则,返回。如果ArrayDeque双端队列已满,则这些方法返回false。
getFirst() - 返回ArrayDeque双端队列的 第一个元素
getLast() - 返回ArrayDeque双端队列的 最后一个元素
注:如果ArrayDeque双端队列为空,getFirst()和getLast()抛出NoSuchElementException。
peek() - 返回ArrayDeque双端队列的 第一个 元素
peekFirst() - 返回ArrayDeque双端队列的 第一个 元素(等效于 peek() )
peekLast() - 返回ArrayDeque双端队列的 最后一个 元素
注:如果ArrayDeque双端队列为空,peek(),peekFirst()和getLast()抛出 NoSuchElementException
remove() - 返回并从ArrayDeque双端队列的 第一个 元素中删除一个元素
remove(element) - 返回并从ArrayDeque双端队列的 头部 删除指定的元素
removeFirst() - 返回并从ArrayDeque双端队列中删除 第一个 元素(等效于remove())
removeLast() - 返回并从ArrayDeque双端队列中删除 最后一个元素
注意:如果数组双端队列为空,则remove(),removeFirst()和removeLast()方法将引发异常。 另外,如果找不到元素,则remove(element)会引发异常。
poll() - 返回并删除ArrayDeque双端队列的 第一个 元素
pollFirst() - 返回并删除ArrayDeque双端队列的 第一个 元素(等效于poll())
pollLast() - 返回并删除ArrayDeque双端队列的 最后一个 元素
注意:如果ArrayDeque双端队列为空,则如果找不到该元素,则poll(),pollFirst()和pollLast()返回null。
删除所有元素
iterator() - 返回可用于遍历ArrayDeque双端队列的 迭代器
descendingIterator() -返回一个迭代器,该迭代器可用于以 相反顺序 遍历ArrayDeque双端队列
注:为了使用这些方法,我们必须导入java.util.Iterator包。
使用迭代器的方法如下
element() -从ArrayDeque双端队列的头部返回一个元素。
contains(element) -在ArrayDeque双端队列中搜索指定的元素。如果找到该元素,则返回true,否则返回false。
size() -返回ArrayDeque双端队列的长度。
toArray() -将ArrayDeque双端队列转换为数组并返回。
clone() -创建ArrayDeque双端队列的副本并返回它。
push() - 在堆栈顶部添加一个元素
peek() - 从堆栈顶部返回一个元素
pop() - 返回并从堆栈顶部删除元素
Java中栈的使用
和C++里面一样,有入栈,弹栈,查找函数
import java.util.*;(引入包含栈类的头文件)
相关函数介绍
boolean empty()
测试堆栈是否为空。
E peek()
查看堆栈顶部的对象,但不从堆栈中移除它。
E pop()
移除堆栈顶部的对象,并作为此函数的值返回该对象。
E push(E item)
把项压入堆栈顶部。
int search(Object o)
返回对象在堆栈中的位置,以 1 为基数。
java术语peek什么意思
【peek】找到但不移除此列表的头(第一个元素)。
【pop】移除顶对象并作为此函数的值返回该对象。
Java 栈 如何实现括号匹配
java栈实现括号匹配,主要是使用栈队列算法,如下代码:
import java.util.Scanner;
import java.util.Stack;
/**
* @author Owner
*
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n= sc.nextInt();//3条测试数据数据
StackCharacter stack = null;
while(n!=0){
//从控制台读入一个测试字符串[]() [(])
String str = sc.next();
//如果该输入字符串为奇数,说明不匹配
if(str.length() % 2 == 1){
System.out.println("No");
}else{
//说明字符是偶数
stack = new StackCharacter();
//遍历第一条测试字符串[]() [(])
for(int i=0;istr.length();i++){
if(stack.isEmpty()){
//如果栈是空的
stack.push(str.charAt(i));
}else if(stack.peek() == '[' str.charAt(i) == ']' || stack.peek() == '(' str.charAt(i) == ')'){
//说明此时栈中字符不是空的,并且符合,
stack.pop();
}else{
stack.push(str.charAt(i));
}
}
if(stack.isEmpty()){
//如果栈是空的,说明括号匹配
System.out.println("Yes");
}else{
//说明栈不为空,括号不匹配
System.out.println("No");
}
}
n--;
}
}
}
关于java栈peek()和java栈peek的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-02,除非注明,否则均为
原创文章,转载请注明出处。