数据结构第三章:栈的应用举例
栈结构所具有的“先进后出”特性,使得栈成为程序设计中的有用工具。在本节我们将介绍几个栈应用的典型例子。
栈应用之一:数制转换
import java.util.Stack;
public class ChangeData {
public static void main(String[] args) {
change(3467,8);
}
public static void change(int data,int dataSize){
Stack<Integer> stack = new Stack<>();
while (data!=0){
stack.push(data%dataSize);
data = data/dataSize;
}
while (!stack.empty()){
Integer pop = stack.pop();
System.out.println(pop);
}
}
}
栈的应用之二:括号匹配
平时刷题的时候会经常遇到一个题目,就是给你一串括号有大括号,中括号,小括号,判断给出的括号能否匹配,这种题目大家第一印象肯定是用栈来实现,基本的思路是判断如果是左边括号入栈,如果是右边括号出栈,最后判断栈是否为空。
后来在论坛里面看到有一个大神提供的解法,感觉思路很不错,在这里就把他记录下来。具体思路如下:
遍历字符串,判断如果是左括号,那么将其对应的右括号入栈,主要这里不是将左括号入栈,举个例子比如当前字符为'{'那么就将'}'入栈;当遇到右括号的时候,判断两个条件:
1、栈不为空;
2、栈顶元素出栈,并且和当前字符相等。
只要这两个条件有一个不满足,那么直接返回false。条件1如果不满足,也就是栈为空,那么表示右括号比左括号的数量要多自然不能匹配;如果出栈的字符和当前的右括号不等,也表示不能匹配成功。
最后判断栈是否为空,为空表示刚好匹配,不为空表示左括号比右括号多。具体代码实现如下:
import java.util.Stack;
import java.util.Scanner;
public class Matching{
public static boolean isVaild(String s){
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (c == '(')
stack.push(')');
else if (c == '{')
stack.push('}');
else if (c == '[')
stack.push(']');
//遍历过程中如果stack为空,证明左符号少于右符号
else if (stack.isEmpty() || stack.pop() != c)
return false;
}
//遍历完成以后如果stack不为空,那么证明左符号多于右符号
return stack.isEmpty();
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()){
String line = in.nextLine();
boolean res = isVaild(line);
System.out.println(res);
}
}
}
艾欧尼亚,昂扬不灭,为了更美好的明天而战(#^.^#)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构