目录

  • 1.栈与队列详解
    • 1.栈
    • 2.队列
  • 2.剑指offer09:用两个栈实现队列
    • 1.题目描述
    • 2.题目解析
      • 我的思路:
      • 大佬思路:
      • 自己实现大佬思路:
  • 3.剑指offer30:用包含min的栈
    • 1.题目描述
    • 2.题目解析
      • 我的思路:
      • 实现:
  • 4.总结

1.栈与队列详解

1.栈

这两篇博客讲得很详细:Java栈详解
C++栈详解
我总结一下:

  1. 栈是只能从一端进行元素的添加和删除的操作受限的线性表,可以用线性表和链表手动实现;线性存储结构;栈中元素遵循先进后出"(First In Last Out)的原则,简称FILO结构;只能在栈顶进行插入和删除操作。
  2. 栈的相关概念:
    栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。
    压栈:栈的插入操作,叫做进栈,也称压栈、入栈。
    弹栈:栈的删除操作,也叫做出栈。
  3. Java标准栈Stack
Stack<T>mystack=new Stack<T>();//定义
public boolean isEmpty()//判断栈是否为空
public int getLength()//获取栈中元素的个数
public void push(T t)//压栈(向栈顶放入元素)
public T pop()//出栈(拿出栈顶元素,并得到它的值)
public T getHeadNext()//获取栈顶元素(未拿出)
public boolean contains(T t)//判断栈中是否包含该元素
  1. C++标准栈:stack
    包含头文件: #include< stack >
stack< int > s;    //定义
s.empty();         //如果栈为空则返回true, 否则返回false;
s.size();          //返回栈中元素的个数
s.top();           //返回栈顶元素, 但不删除该元素
s.pop();           //弹出栈顶元素, 但不返回其值
s.push();          //将元素压入栈顶

2.队列

  1. 队列是先进先出(First In First Out)FIFO的线性存储结构;可以使用顺序存储和链式存储手动实现;只允许在队首删除元素,在队尾插入元素。
  2. 在java中队列有两种实现方式:循环数组ArrayDeque和链表LinkedList
    java实现Queue
//新建
Queue<T> queue = new LinkedList<>();
//添加元素
queue.offer(T1);
//删除元素
queue.poll(T1);
//查看队首元素
queue.peek();

offer,add 区别:

一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。

这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。

poll,remove 区别:

remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

peek,element区别:

element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

2.剑指offer09:用两个栈实现队列

1.题目描述

2.题目解析

我的思路:

1.栈为先进后出,队列是先进先出,所以可以使用一个栈A存储数据,在删除队列元素时将栈内所有元素倒序入另一个栈B,然后去除栈顶元素将所有元素倒入栈A。
2.java实现:

class CQueue {Stack<Integer>ru;Stack<Integer>chu;public CQueue() {ru=new Stack<Integer>();chu=new Stack<Integer>();}public void appendTail(int value) {ru.push(new Integer(value));}public int deleteHead() {if(ru.empty())return -1;while(!ru.empty()){Integer tem=ru.pop();chu.push(tem);}int res=chu.pop();while(!chu.empty()){Integer tem=chu.pop();ru.push(tem);}return res;}
}

结果:

可以看到不高效,因为每次除去队列首元素时都进行了两次倾倒动作。

大佬思路:

一个栈A接收元素,然后删除队首元素时,将所有元素倒入另一个栈B,去除B栈顶元素即为去除队列首元素。以后再添加元素即加入A栈顶即可,删除元素时需要看B:

  • 若B中还有元素,直接去除栈顶元素即可;
  • 若B中无元素A中有元素,直接将A中所有元素入B,然后再去除栈顶元素;
  • 若AB中均无元素,直接返回-1。
class CQueue {LinkedList<Integer> A, B;public CQueue() {A = new LinkedList<Integer>();B = new LinkedList<Integer>();}public void appendTail(int value) {A.addLast(value);}public int deleteHead() {if(!B.isEmpty()) return B.removeLast();if(A.isEmpty()) return -1;while(!A.isEmpty())B.addLast(A.removeLast());return B.removeLast();}
}// 作者:jyd
// 链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/solution/mian-shi-ti-09-yong-liang-ge-zhan-shi-xian-dui-l-2/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
自己实现大佬思路:
class CQueue {Stack<Integer>a,b;public CQueue() {a=new Stack<Integer>();b=new Stack<Integer>();}public void appendTail(int value) {a.push(new Integer(value));}public int deleteHead() {if(!b.empty()){return b.pop();}else if(!a.empty()){while(!a.empty()){Integer temp=a.pop();b.push(temp);}return b.pop();}elsereturn -1;}
}

3.剑指offer30:用包含min的栈

1.题目描述

2.题目解析

我的思路:

第一眼看到时就想拿个int存储最小值,但是最小值去除之后再找最小值就难以操作,需要记录第二小的值。
于是我查看了题解,只需要一个辅助栈存储逆序的值即可,关键是因为栈的特性,已存在的数据位置不会改变,所以只需存储从第一个元素开始的严格逆序的元素即可。

实现:
class MinStack {Stack<Integer>st;Stack<Integer>helpst;/** initialize your data structure here. */public MinStack() {st=new Stack<Integer>();helpst=new Stack<Integer>();}public void push(int x) {st.push(new Integer(x));if(helpst.empty()){helpst.push(new Integer(x));return;}if(x<=helpst.peek().intValue())helpst.push(new Integer(x));}public void pop() {int temp=st.pop();if(temp==helpst.peek().intValue())helpst.pop();}public int top() {return st.peek().intValue();}public int min() {return helpst.peek().intValue();}
}

4.总结

1.我好像没有深入理解栈与队列的特性,比如第二题中,辅助栈只需存储逆序元素即可,我还反应了好一会儿才明白;
2.编程手感要一直练才会存在。
3.参考:
java队列
java栈

剑指offer 09、30:栈与队列相关推荐

  1. abap判断包含字符当中包含小数点_剑指Offer整理3 -- 栈和队列 + 数学和字符串

    专题3 栈和队列 + 数学和字符串 专题3-1 栈和队列 1. 栈的压入弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字 ...

  2. 剑指offer 算法(栈和队列 查找和排序)

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解析:用栈来模拟队列.我们首先插入一个元素a到stack1中,再压入两个元素bc,此时栈中有元素abc, ...

  3. 《LeetCode力扣练习》剑指 Offer 09. 用两个栈实现队列 Java

    <LeetCode力扣练习>剑指 Offer 09. 用两个栈实现队列 Java 一.资源 题目: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 de ...

  4. java 栈和队列实现迷宫代码_LeetCode每日一题--剑指 Offer 09. 用两个栈实现队列(Java)

    DailyChallenge 剑指 Offer 09. 用两个栈实现队列 Easy20200630 Description 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTai ...

  5. 【LeetCode】剑指 Offer 09. 用两个栈实现队列

    [LeetCode]剑指 Offer 09. 用两个栈实现队列 文章目录 [LeetCode]剑指 Offer 09. 用两个栈实现队列 一.双栈 总结 一.双栈 维护两个栈,第一个栈支持插入操作,第 ...

  6. 剑指offer系列-30.包含min函数的栈

    剑指offer系列第30题.包含min函数的栈 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中, 调用 min.push 及 pop 的时间复杂度都是 ...

  7. 剑指Offer #09 变态跳台阶(数列推导)

    题目来源:牛客网-剑指Offer专题 题目地址:变态跳台阶 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 题目解析 这道题有 ...

  8. 剑指offer---用两个栈实现队列

    题目:用两个栈实现队列 要求:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 1 class Solution 2 { 3 public: 4 void push ...

  9. Leetcode 剑指 Offer 09. 用两个栈实现队列 (每日一题 20210915)

    用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,deleteHea ...

  10. 【双100%提交】剑指 Offer 09. 用两个栈实现队列

    立志用最少的代码做最高效的表达 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队 ...

最新文章

  1. Spring 是如何解决并发访问的线程安全性问题的
  2. 数据库对象 同义词 索引 序列 视图
  3. Android 应用 之路 MPAndroidChart~ScatterChart
  4. Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法【转发】
  5. Pytorch自定义数据集
  6. 【统计学习】概率论与统计学基础
  7. 每个用户做独立的线程同步
  8. 关于新的描述语言GEZEL的介绍
  9. java 调用 js性能_太快了,太变态了:什么会影响Java中的方法调用性能?
  10. 信息学奥赛C++语言: 直角三角形
  11. 香港中文大学(深圳)吴保元教授课题组博士后招聘
  12. 文档下载:《Oracle 20c和19c的新特性解密》
  13. python execfile_python中eval, exec, execfile,和compile [转载]
  14. 告知书页面html样式,纯CSS实现的三种通知栏滚动效果
  15. 华为云、百度、斗鱼的技术专家聚到一起在探讨什么?
  16. Vue事件修饰符.prevent .passive
  17. 微信公众平台开发3-微信服务器IP接口实例(含源码)
  18. 服务器证书类型有哪些
  19. 设备管理器中的usb打印支持有个叹号是什么意思,如何解决?
  20. 编译实验 lr c语言代码,编译原理-实验5-LR(1)分析法

热门文章

  1. HTML5期末大作业:关于家乡介绍主题网页设计——云南民族文化(8页) HTML+CSS+JavaScript 期末作业HTML代码 学生网页课程设计期末作业下载 web网页设计制作成品
  2. 八种常见的防盗链方法总结及分析 (转自http://www.cnblogs.com/uubox)
  3. 金九银十,果然如此,这个九月有点折腾
  4. word排版案例报告_看完这4个文章排版要点,你就会排版啦!
  5. mysql服务状态一直是启动解决方案
  6. Win11系统pin码忘记了怎么办?Win11忘记pin码解决方法
  7. Unity GUI 中文显示
  8. 小团团云上城在哪个服务器,云上城之歌小团团
  9. android 刷机 备份,盘点和对比 Android刷机前的数据备份
  10. 思科模拟器中的交换机使用方法