Java: 递归查找堆栈中的最小元素
Java: Recursively Finding the minimum element in a Stack
public static void removeMin(Stack<Integer> st)
{
if (st.isEmpty())
return;
int min = st.pop();
removeMin(st);
if(min<st.top())
return;
st.push(min);
}
我试图找到最小元素并将其删除,但不幸的是我不能。我想得到一些帮助,这是我的代码。
我在Class Stack中只有这些方法:equals、isEmpty、pop、push、top、toString(主要方法)。
提前致谢。
您必须将堆栈顶部的元素与堆栈其余部分的最小元素进行比较。
那不是你在做什么。您只是将堆栈的顶部与堆栈的下一个元素进行比较。
您可能应该将递归方法更改为 return 最小元素。这样你就可以和它比较了:
public static int removeMin(Stack<Integer> st)
{
if (st.isEmpty())
return Integer.MAX_VALUE; // if the stack is empty, return a value that is larger
// than any other value
int top = st.pop();
int min = removeMin(st);
if(top < min) {
// top is the minimum element
st.push(min);
return top;
} else {
// min is the minimum element
st.push(top);
return min;
}
}
我还没有测试过。
我测试了你的方法。你有两条线 t运行sposed。您需要做的就是在测试之后 放置递归调用。
public static void removeMin(Stack<Integer> st) {
if (st == null || st.isEmpty())
return;
int min = st.pop();
if(st.isEmpty() || min<st.firstElement())
return;
removeMin(st); // this was in the wrong place, causing the stack to empty out completely
st.push(min);
}
我运行这个例子:
public static void main (String[] args) {
Stack<Integer> stack = new Stack<>();
stack.add(2);
stack.add(1); // to be removed
stack.add(5);
stack.add(3);
stack.add(4);
removeMin(stack);
System.out.println(stack.toString());
}
并打印出 [2, 5, 3, 4]
.
此解决方案适用于位于堆栈顶部、底部或中间任何位置的最小值。
public static void removeMin(Stack<Integer> st)
{
if (st.isEmpty())
return;
int min = st.pop();
removeMin(st);
if(min<st.top())
return;
st.push(min);
}
我试图找到最小元素并将其删除,但不幸的是我不能。我想得到一些帮助,这是我的代码。
我在Class Stack中只有这些方法:equals、isEmpty、pop、push、top、toString(主要方法)。
提前致谢。
您必须将堆栈顶部的元素与堆栈其余部分的最小元素进行比较。
那不是你在做什么。您只是将堆栈的顶部与堆栈的下一个元素进行比较。
您可能应该将递归方法更改为 return 最小元素。这样你就可以和它比较了:
public static int removeMin(Stack<Integer> st)
{
if (st.isEmpty())
return Integer.MAX_VALUE; // if the stack is empty, return a value that is larger
// than any other value
int top = st.pop();
int min = removeMin(st);
if(top < min) {
// top is the minimum element
st.push(min);
return top;
} else {
// min is the minimum element
st.push(top);
return min;
}
}
我还没有测试过。
我测试了你的方法。你有两条线 t运行sposed。您需要做的就是在测试之后 放置递归调用。
public static void removeMin(Stack<Integer> st) {
if (st == null || st.isEmpty())
return;
int min = st.pop();
if(st.isEmpty() || min<st.firstElement())
return;
removeMin(st); // this was in the wrong place, causing the stack to empty out completely
st.push(min);
}
我运行这个例子:
public static void main (String[] args) {
Stack<Integer> stack = new Stack<>();
stack.add(2);
stack.add(1); // to be removed
stack.add(5);
stack.add(3);
stack.add(4);
removeMin(stack);
System.out.println(stack.toString());
}
并打印出 [2, 5, 3, 4]
.
此解决方案适用于位于堆栈顶部、底部或中间任何位置的最小值。