题目一:有效的括号

问题描述

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

解题思路

这道题让我们验证输入的字符串是否为括号字符串,包括大括号,中括号和小括号。

这里我们使用

  • 遍历输入字符串
  • 如果当前字符为左半边括号时,则将其压入栈中
  • 如果遇到右半边括号时,分类讨论:
  • 1)如栈不为空且为对应的左半边括号,则取出栈顶元素,继续循环
  • 2)若此时栈为空,则直接返回 false
  • 3)若不为对应的左半边括号,反之返回 false

动画演示

代码实现

class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();char[] chars = s.toCharArray();for (char aChar : chars) {if (stack.size() == 0) {stack.push(aChar);} else if (isSym(stack.peek(), aChar)) {stack.pop();} else {stack.push(aChar);}}return stack.size() == 0;}private boolean isSym(char c1, char c2) {return (c1 == '(' && c2 == ')') || (c1 == '[' && c2 == ']') || (c1 == '{' && c2 == '}');}
}

题目二:用两个栈实现队列

问题描述

用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。

解题思路

in 栈用来处理入栈(push)操作,out 栈用来处理出栈(pop)操作。一个元素进入 in 栈之后,出栈的顺序被反转。当元素要出栈时,需要先进入 out 栈,此时元素出栈顺序再一次被反转,因此出栈顺序就和最开始入栈顺序是相同的,先进入的元素先退出,这就是队列的顺序。

  • push 元素时,始终是进入栈,pop 和 peek 元素时始终是走出栈。
  • pop 和 peek 操作,如果出栈为空,则需要从入栈将所有元素移到出栈,也就是调换顺序,比如开始push的顺序是 3-2-1,1 是最先进入的元素,则到出栈的顺序是 1-2-3,那 pop 操作拿到的就是 1,满足了先进先出的特点。
  • pop 和 peek 操作,如果出栈不为空,则不需要从入栈中移到数据到出栈。

代码实现

Stack<Integer> in = new Stack<Integer>();
Stack<Integer> out = new Stack<Integer>();public void push(int node) {in.push(node);
}public int pop() throws Exception {if (out.isEmpty())while (!in.isEmpty())out.push(in.pop());if (out.isEmpty())throw new Exception("queue is empty");return out.pop();
}

题目三:栈的压入、弹出序列

问题描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

解题思路

借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是 1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是 4,很显然 1≠4 ,所以需要继续压栈,直到相等以后开始出栈。

出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。

代码实现

public boolean IsPopOrder(int[] pushSequence, int[] popSequence) {int n = pushSequence.length;Stack<Integer> stack = new Stack<>();for (int pushIndex = 0, popIndex = 0; pushIndex < n; pushIndex++) {stack.push(pushSequence[pushIndex]);while (popIndex < n && !stack.isEmpty() && stack.peek() == popSequence[popIndex]) {stack.pop();popIndex++;}}return stack.isEmpty();
}

题目四:包含 min 函数的栈

问题描述

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的 min 函数。

解题思路

使用两个 stack,一个作为数据栈,另一个作为辅助栈。其中 数据栈 用于存储所有数据,而 辅助栈 用于存储最小值。

举个 :

  1. 入栈的时候:首先往空的数据栈里压入数字 3 ,此时 3 是最小值,所以把最小值压入辅助栈。接下来往数据栈里压入数字 4 。由于 4 大于之前的最小值,因此只要入数据栈,不需要压入辅助栈。
  2. 出栈的时候:当数据栈和辅助栈的栈顶元素相同的时候,辅助栈的栈顶元素出栈。否则,数据栈的栈顶元素出栈。
  3. 获得栈顶元素的时候:直接返回数据栈的栈顶元素。
  4. 栈最小元素:直接返回辅助栈的栈顶元素。

代码实现

private Stack<Integer> dataStack = new Stack<>();
private Stack<Integer> minStack = new Stack<>();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();
}

个人网站:程序员小吴

个人公众号:五分钟学算法

c语言堆栈基本代码入栈出栈_几道和「堆栈、队列」有关的面试算法题相关推荐

  1. Go语言_数据结构_栈(包括入栈和出栈,表达式的入栈出栈详细过程代码实现)

    入栈和出栈代码实现如下: package main import ("fmt""errors" )//使用数组来模拟一个栈的使用 type Stack stru ...

  2. Java开发中巧妙使用链表来实现模拟栈的入栈出栈操作

    2019独角兽企业重金招聘Python工程师标准>>> 在Java开发中经常会碰到需要你用Java链表来实现入栈出栈的模拟操作,下文就这个操作做了一个详细的描述. 栈:后进先出:最后 ...

  3. 【数据结构】栈详解——压栈/入栈 | 弹栈/出栈 | 获取栈顶元素

    栈 顺序栈 栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈, ...

  4. 【Android 逆向】x86 汇编 ( push / pop 入栈 / 出栈 指令 | ret / retn 函数调用返回指令 | set 设置目标值指令 )

    文章目录 一.push / pop 入栈 / 出栈 指令 二.ret / retn 函数调用返回指令 三.set 设置目标值指令 总结 一.push / pop 入栈 / 出栈 指令 push / p ...

  5. 数据结构 - 栈(链表实现栈的入栈出栈)

    学完链表和栈,数组模拟栈学完后,自己根据链表写了个链栈,虽然只是简单的实现了入栈出栈遍历.收获还是很大的. 在push这里思考了一会,思路是:传入一个数字,push里创建一个节点node,把数据加入n ...

  6. PLC实现入栈出栈功能

    入栈出栈 实现需求 准备工作 入栈 PLC程序 仿真效果 出栈 PLC程序 仿真效果 源程序 实现需求 使用西门子PLC实现入栈出栈的功能,出入栈顺序为先入先出 准备工作 创建FC块.入栈和出栈两个F ...

  7. 2023新华为OD机试题 - 入栈出栈(JavaScript) | 刷完必过

    华为Od必看博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单 华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典 华为OD机试 全流程解析+经验分享,题型分 ...

  8. PLC实现入栈出栈功能(SCL)

    PLC实现入栈出栈功能(SCL 引言 功能需求 准备工作 入栈 PLC程序 出栈 PLC程序 触摸屏画面程序 源程序 引言 之前用梯形图实现了PLC入栈出栈功能,这次使用SCL来实现此功能. 功能需求 ...

  9. 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】

    刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高. 华为 OD 清单查看地址:https://blog.csdn.net/hihell/categor ...

最新文章

  1. JavaScript Book Plan
  2. sqlite的控制台中文显示问题
  3. 如何让页面停止加载_Axure 案例:数值加载效果
  4. javaweb 解决请求相应的乱码问题
  5. thinkphp5中的系统文件上传和$_FILES用法区别
  6. php mysql无限_php+mysql实现无限分类实例详解
  7. 什么是BSP工程师?
  8. Java中二维数组和面向对象
  9. 90 后程序员开发“AI 吵架神器”,专治女朋友各种不服!
  10. 大数据平台目前存在的问题
  11. #Leetcode# 141. Linked List Cycle
  12. 大数据技术Hadoop介绍
  13. 【leetcode 简单】 第六十六题 用栈实现队列
  14. SLA文档提高期学习总结
  15. 0 win10重装partition_如何重装win 10 系统?
  16. 第三只眼网络监控软件简单分析,试用及清除
  17. Directshow完整介绍
  18. UE-摄像机视角的切换
  19. [笔记]-后端学习笔记
  20. Django中的跨域解决办法 基于后端的跨域解决方案

热门文章

  1. 硬干货!一张图弄清楚在ESXi下如何进行网络抓包
  2. Maven学习总结(57)—— 如何提高 Maven 的构建速度?maven-mvnd 又是什么鬼?
  3. 软件路由测试,软路由测试
  4. java集合类的框架图_Java集合框架01-框架总览
  5. 微服务主见传递ID还是json_Feign实现微服务间文件传递
  6. 数据库优化查询的方法以及大访问量到数据库时的优化
  7. Spring(10)——bean作用范围(二)—自定义scope
  8. 【Hadoop Summit Tokyo 2016】一小时之内使用Apache Nifi从零到数据流
  9. Android Studio导入Eclipse项目
  10. Oracle数据库中文乱码问题