• 面试准备之刷题总结:栈和队列



    栈和队列


    正文

    栈和队列

    1. 用两个栈实现队列

    1. 题目表述

      用两个栈实现一个队列。队列的声明如下:请实现它的两个函数appendTaildeleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。

    1. 解题思路

      一个栈用来存储插入队列数据,一个栈用来从队列中取出数据。从第一个栈向第二个栈转移数据的过程中:数据的性质已经从后入先出变成了先入先出。

    1. 代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import java.util.Stack;
    public class {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();

    public void appendTail(int node) {
    stack1.push(node);
    }

    public int deleteHead() {
    if(stack2.isEmpty())
    while(!stack1.isEmpty())
    stack2.push(stack1.pop());
    if(stack2.isEmpty())
    throw new RuntimeException("queue is empty");
    return stack2.pop();
    }
    }

    2. 包含min函数的栈

    1. 题目表述

      定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数。在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

    1. 解题思路

      有关栈的题目,可以考虑使用“辅助栈”,即利用空间换时间的方法。

      这道题就是借助“辅助栈”来实现。当有新元素被 push 进普通栈的时候,程序比较新元素和辅助栈中的原有元素,选出最小的元素,将其放入辅助栈

      根据栈的特点和操作思路,辅助栈顶的元素就是最小元素。并且辅助栈的元素和普通栈的元素是“一一对应”的。

    1. 代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24< 大专栏  面试准备之刷题总结:栈和队列/span>
    import java.util.Stack;

    public class {

    private Stack<Integer> dataStack = new Stack<Integer>();
    private Stack<Integer> minStack = new Stack<Integer>();
    public void push(int node) {
    dataStack.push(node);
    minStack.push(minStack.isEmpty()?node:Math.min(minStack.peek(),node));
    }

    public void pop() {
    dataStack.pop();
    minStack.pop();
    }

    public int top() {
    return dataStack.peek();
    }

    public int min() {
    return minStack.peek();
    }
    }

    3. 栈的压入弹出序列

    1. 题目表述

      输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。

      例如序列 1、2、3、4、5 是某栈的压栈序列,序列 4、5、3、2、1 是该压栈序列对应的一个弹出序列,但 4、3、5、1、2 就不可能是该压栈序列的弹出序列。

    1. 解题思路

      栈的题目还是借助“辅助栈”。大体思路如下:

      1. 入栈序列的元素入栈
      2. 检查栈顶元素和弹栈序列元素是否一致
    • 元素一致,弹出栈元素,弹栈序列指针后移

    • 不一致,回到第一步

      最后判断栈是否为空。

    1. 代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import java.util.ArrayList;
    import java.util.Stack;
    public class {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
    Stack<Integer> stack = new Stack<Integer>();
    int n = pushA.length;
    for(int pushindex=0,popindex=0;pushindex<n;pushindex++){
    stack.push(pushA[pushindex]);
    while(popindex<n&&!stack.isEmpty()&&stack.peek()==popA[popindex]){
    stack.pop();
    popindex++;
    }
    }
    return stack.isEmpty();
    }
    }
  • 相关阅读:
    机器学习笔记(二)---- 线性回归
    机器学习笔记(一)----基本概念
    ZZ:SDNLAB技术分享(一):ODL的SFC入门和Demo
    zz:NETCONF协议详解
    技术谈 | SDN 和 NFV 之间的爱与恨
    华为云内容审核—性能更加狂野,价格更加腼腆
    【并发技术01】传统线程技术中创建线程的两种方式
    【开发者portal在线开发插件系列五】命令的响应,即命令结果的上报(mid的使用)
    【并发技术16】线程同步工具Exchanger的使用
    什么是API文档?--斯科特·马文
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12376175.html
Copyright © 2020-2023  润新知