栈与队列栈 (stack)是一种后进先出(last in first off,lifo)的数据结构
队列(queue)则是一种先进先出 (fisrt in first out,fifo)的结构
栈 (stack)栈是一种线性结构,与数组相比,栈对应的操作是数组的子集。
它只能从一端添加元素,也只能从一端取出元素(这一端称之为栈顶)。
stack这种数据结构用途很广泛,在计算机的使用中,大量的运用了栈,比如编译器中的词法分析器、java虚拟机、软件中的撤销操作(undo)、浏览器中的回退操作,编译器中的函数调用实现等等。
栈的实现接口说明复杂度
void push(e e) 向栈中加入元素 o(1) 均摊
e pop() 弹出栈顶元素 o(1) 均摊
e peek() 查看栈顶元素 o(1)
int getsize() 获取栈中元素个数 o(1)
boolean isempty() 判断栈是否为空 o(1)
说明:push和pop操作在最后面进行,有可能触发resize,但均摊来算是o(1)的。
如果你想了解更多时间复杂度的分析,欢迎关注笔者后续要更新的文章:o(n)说明的是什么问题?
栈的实现可以通过 数组 或者 链表 实现,在这里我们使用 数组来实现上述接口。
在栈的设计中,用户只关注栈顶元素存取和栈长度,因此设计代码如下:
读者可以使用 栈 这种数据结构去解决leetcode上的第20号问题:有效的括号,也可以查看 每天一算:valid parentheses。
队列 queue队列也是一种线性数据结构,与数组相比,队列对应的操作是数组的子集。
只能从一端 (队尾) 添加元素,只能从另一端 (队首) 取出元素。
队列的应用可以在播放器上的播放列表,数据流对象,异步的数据传输结构(文件io,管道通讯,套接字等)上体现,当然最直观的的就是排队了。
队列的实现接口说明复杂度
void enqueue(e e) 入队 o(1) 均摊
e dequeue() 出队 o(n)
e getfront() 获取队首元素 o(1)
int getsize() 获取队列元素个数 o(1)
boolean isempty() 判断队列是否为空 o(1)
入队是从队尾开始,有可能触发resize,因此均摊下来是o(1)。出队是在队首,数组实现每次都要挪动所有元素,o(n)。
以上就是java栈与队列如何实现的详细内容。