java - 为什么即使我将元素推入堆栈,堆栈仍然是空的
问题描述
我正在尝试进行平衡字符串测试。即使我将一个元素推入堆栈也很烦人:stack.push(s.charAt(0)),它仍然在 Stack.StackTest.main(StackTest.java:18) 处显示 EmptyStackException。这是我的代码:
import java.util.Stack;
public class StackTest
{
public static void main (String[] args)
{
//Scanner scanner = new Scanner(System.in);
Stack<Character> stack = new Stack<>();
int i;
String s = "{}(){}{}{}";
stack.push(s.charAt(0));
for (i = 1;i < s.length();i++)
{
if (stack.peek() == '{' && s.charAt(i) == '}')
{
if (!stack.empty())
{
stack.pop();
}
}
else if (stack.peek() == '[' && s.charAt(i) == ']')
{
if (!stack.empty())
{
stack.pop();
}
}
else if (stack.peek() == '(' && s.charAt(i) == ')')
{
if (!stack.empty())
{
stack.pop();
}
}
else
{
stack.push(s.charAt(i));
}
}
while (!stack.empty())
{
System.out.print(stack.pop());
}
}
}
解决方案
您的堆栈在循环的第一次迭代时不是空的,但第一次迭代会从堆栈中弹出唯一的元素。然后,当您在下一次迭代中调用 时stack.peek()
,您会得到EmptyStackException
.
您应该将!stack.empty()
条件放在stack.peek()
语句之前以避免EmptyStackException
.
例如,改变
if (stack.peek() == '{' && s.charAt(i) == '}')
{
if (!stack.empty())
{
stack.pop();
}
}
至
if (!stack.isEmpty() && stack.peek() == '{' && s.charAt(i) == '}')
{
stack.pop();
}
你应该以同样的方式改变你的其他条件。
推荐阅读
- oracle - Flyway:创建视图为 WITH(公用表表达式 CTE)
- wix - 无法从 WiX 创建的 MSI 卸载程序
- laravel - Laravel 迁移修饰符 ->after('column') 不起作用
- javascript - 避免区分大小写字符的优雅方法?(最好在 JavaScript 中)
- excel - 使用 VBA XMLHTTP getElementsByClassName() 从 Twitter 获取信息时出现错误 438
- angular - 在函数上调用订阅时无法读取未定义的属性“订阅”
- powershell-4.0 - 从 AD 导入变量以映射驱动器
- c# - 为 RoleManager 和 UserManager 创建实例以进行单元测试?
- python - 由 findFundamentalMat() 和 stereoCalibrate() 计算的不同基本矩阵
- c++ - 带有 GStreamer 安装问题的 Yocto OpenCV