[算法总结] 6 道题搞定 BAT 面试——堆栈和队列
本文首发于我的个人博客:尾尾部落
0. 基础概念
栈:后进先出(LIFO)

队列:先进先出(FIFO)

1. 栈的 java 实现
import java.util.Arrays;
public class Stack {
private int size = 0; //栈顶位置
private int[] array;
public Stack(){
this(10);
}
public Stack(int init) {
if(init <= 0){
init = 10;
}
array = new int[init];
}
/**
* 入栈操作
* @param item 入栈的元素
*/
public void push(int item){
if(size == array.length){
array = Arrays.copyOf(array, size*2); //扩容操作
}
array[size++] = item;
}
/**
* 获取栈顶元素,但栈顶元素不出栈
* @return 栈顶元素
*/
public int peek(){
if(size == 0){ //空栈
throw new IndexOutOfBoundsException("栈是空的");
}
return array[size-1];
}
/**
* 出栈,同时获取栈顶元素
* @return
*/
public int pop(){
int item = peek(); //获取栈顶元素
size--; //直接使元素个数减1,不用清除元素,下次入栈会覆盖旧元素的值
return item;
}
/**
* 判断栈是否已满
* @return
*/
public boolean isFull(){
return size == array.length;
}
/**
* 判断栈是否为空
* @return
*/
public boolean isEmpty(){
return size == 0;
}
public int getSize(){
return size;
}
}
2. 队列的 java 实现
public class ArrayQueue {
private final Object[] queue; //声明一个数组
private int head;
private int tail;
/**
* 初始化队列
* @param capacity 队列长度
*/
public ArrayQueue(int capacity){
this.queue = new Object[capacity];
}
/**
* 入队
* @param o 入队元素
* @return 入队成功与否
*/
public boolean put(Object o){
if(head == (tail+1)%queue.length){
//说明队满
return false;
}
queue[tail] = o;
tail = (tail+1)%queue.length; //tail标记后移一位
return true;
}
/**
* 返回队首元素,但不出队
* @return
*/
public Object peak() {
if(head==tail){
//队空
return null;
}
return queue[head];
}
/**
* 出队
* @return 出队元素
*/
public Object pull(){
if(head==tail){
return null;
}
Object item = queue[head];
queue[head] = null;
return item;
}
/**
* 判断是否为空
* @return
*/
public boolean isEmpty(){
return head == tail;
}
/**
* 判断是否为满
* @return
*/
public boolean isFull(){
return head == (tail+1)%queue.length;
}
/**
* 获取队列中的元素个数
* @return
*/
public int getsize(){
if(tail>=head){
return tail-head;
}else{
return (tail+queue.length)-head;
}
}
}
3. 用两个栈实现队列
剑指offer:用两个栈实现队列
LeetCode:Implement Queue using Stacks
class MyQueue {
Stack<Integer> input = new Stack<Integer>();
Stack<Integer> output = new Stack<Integer>();
/** Push element x to the back of queue. */
public void push(int x) {
input.push(x);
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
peek();
return output.pop();
}
/** Get the front element. */
public int peek() {
if(output.isEmpty()){
while(!input.isEmpty())
output.push(input.pop());
}
return output.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
return input.isEmpty() && output.isEmpty();
}
}
4. 用队列实现栈
LeetCode:Implement Stack using Queues
class MyStack {
Queue<Integer> q1 = new LinkedList<Integer>();
Queue<Integer> q2 = new LinkedList<Integer>();
/** Push element x onto stack. */
public void push(int x) {
if(q1.isEmpty()){
q1.add(x);
for(int i = 0; i < q2.size(); i++){
q1.add(q2.poll());
}
}else{
q2.add(x);
for(int i = 0; i < q1.size(); i++){
q2.add(q1.poll());
}
}
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
return q1.isEmpty() ? q2.poll() : q1.poll();
}
/** Get the top element. */
public int top() {
return q1.isEmpty() ? q2.peek() : q1.peek();
}
/** Returns whether the stack is empty. */
public boolean empty() {
return q1.isEmpty() && q2.isEmpty();
}
}
5. 包含min函数的栈
剑指offer:包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
class MinStack {
Stack<Integer> stack = new Stack<Integer>();
Stack<Integer> temp = new Stack<Integer>();
public void push(int x) {
stack.push(x);
if(temp.isEmpty() || temp.peek() >= x)
temp.push(x);
}
public void pop() {
int x = stack.pop();
int min = temp.peek();
if(x == min)
temp.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return temp.peek();
}
}
6. 栈的压入、弹出序列
剑指offer:栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public boolean IsPopOrder(int [] pushA, int [] popA) {
if(pushA.length != popA.length ||
pushA.length == 0 ||
popA.length == 0)
return false;
Stack<Integer> stack = new Stack<>();
int index = 0;
for(int i = 0; i < pushA.length; i++){
stack.push(pushA[i]);
while(!stack.empty() && stack.peek() == popA[index]){
stack.pop();
index++;
}
}
return stack.empty();
}
}
[算法总结] 6 道题搞定 BAT 面试——堆栈和队列的更多相关文章
- [算法总结] 13 道题搞定 BAT 面试——字符串
1. KMP 算法 谈到字符串问题,不得不提的就是 KMP 算法,它是用来解决字符串查找的问题,可以在一个字符串(S)中查找一个子串(W)出现的位置.KMP 算法把字符匹配的时间复杂度缩小到 O(m+ ...
- [算法总结] 20 道题搞定 BAT 面试——二叉树
本文首发于我的个人博客:尾尾部落 0. 几个概念 完全二叉树:若二叉树的高度是h,除第h层之外,其他(1~h-1)层的节点数都达到了最大个数,并且第h层的节点都连续的集中在最左边.想到点什么没?实际上 ...
- 【搞定Jvm面试】 Java 内存区域揭秘附常见面试题解析
本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb ([Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识)如果觉得不错 ...
- 【搞定Jvm面试】 JVM 垃圾回收揭秘附常见面试题解析
JVM 垃圾回收 写在前面 本节常见面试题 问题答案在文中都有提到 如何判断对象是否死亡(两种方法). 简单的介绍一下强引用.软引用.弱引用.虚引用(虚引用与软引用和弱引用的区别.使用软引用能带来的好 ...
- 搞定redis面试--Redis的过期策略?手写一个LRU?
1 面试题 Redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现? 2 考点分析 1)我往redis里写的数据怎么没了? 我们生产环境的redis怎么经常会丢掉一些数据?写进去了 ...
- 搞定PHP面试 - 变量知识点整理
一.变量的定义 1. 变量的命名规则 变量名可以包含字母.数字.下划线,不能以数字开头. $Var_1 = 'foo'; // 合法 $var1 = 'foo'; // 合法 $_var1 = 'fo ...
- 【搞定Jvm面试】 JDK监控和故障处理工具揭秘
本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb ([Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识)如果觉得不错 ...
- 【Javascript】搞定JS面试——跨域问题
什么是跨域? 为什么不能跨域? 跨域的解决方案都有哪些(解决方法/适用场景/get还是post)? 一.什么是跨域? 只要协议.域名.端口有任何一个不同,就是跨域. ...
- 30秒搞定String面试
Java 语言中,无论新菜鸟,还是老司机,真正了解String内存的很少.关于String 的试题,花样很多.== 在什么情况下是true,什么情况是false.我总结出如下3点让你彻底结束对Stri ...
随机推荐
- od 转储 二进制文件常用命令
od : NAME od - dump files in octal and other formats 常用命令: ➜ Downloads od -t x1 -Ax /etc/ld.so.cach ...
- Springboot系列:Springboot与Thymeleaf模板引擎整合基础教程(附源码)
前言 由于在开发My Blog项目时使用了大量的技术整合,针对于部分框架的使用和整合的流程没有做详细的介绍和记录,导致有些朋友用起来有些吃力,因此打算在接下来的时间里做一些基础整合的介绍,当然,可能也 ...
- 【转】form data和request payload的区别
HTML <form> 标签的 enctype 属性 在下面的例子中,表单数据会在未编码的情况下进行发送: <form action="form_action.asp&qu ...
- 【转】使用Chrome Frame,彻底解决浏览器兼容问题
本文转自http://www.ryanbay.com/?p=269,感谢该作者的总结 X-UA-Compatible是自从IE8新加的一个设置,对于IE8以下的浏览器是不识别的. 通过在meta中设置 ...
- JS播放声音
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>JS播放声音</tit ...
- ORA-27125: unable to create shared memory segment的解决方法(转)
ORA-27125: unable to create shared memory segment的解决方法(转) # Kernel sysctl configuration file for Red ...
- WorldWind源码剖析系列:地形瓦片类TerrainTile和地形瓦片服务类TerrainTileService
地形瓦片类TerrainTile 用来抽象封装用户漫游中所请求的地形瓦片数据类型. 地形瓦片服务类TerrainTileService提供了从BIL(Binary Interleaved by Lin ...
- windows10 安装 Anaconda 并配置 pytorch1.0
官网下载Anaconda安装包,按步骤安装即可安装完后,打开DOS,或Anaconda自带的Anaconda Prompt终端查看Anaconda已安装的安装包C:\Users\jiangshan&g ...
- 对寄存器ESP和EBP的一些理解
PS:EBP是当前函数的存取指针.即存储或者读取数时的指针基地址:ESP就是当前函数的栈顶指针. 每一次发生函数的调用(主函数调用子函数)时,在被调用函数初始时,都会把当前函数(主函数)的EBP压栈, ...
- 人的一生为什么要努力 &1
2018-06-25