数据结构与算法、
Task03:栈与递归、
递归理解:
递归需要满足的三个条件:
- 一个问题的解可以分解为几个子问题的解
- 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一
- 存在递归终止条件
递归最重要的是写出递推公式,然后找到终止条件。
车辆重排问题
public class TrainArrange {
ArrayStack<Integer> stack;
public boolean railroad(int [] data,int k){
stack = new ArrayStack<>();
for (int i = 0; i <k; i++) {
stack.push(i);
}
int nowOut = 1;
int minH = Integer.MIN_VALUE;
int minS = -1;
for (int i = 0; i <data.length ; i++) {
if(data[i]==nowOut){
System.out.println(data[i]);
nowOut++;
while(minH == minS){
output(minH,minS,stack);
nowOut++;
}
}else{
if (Hold(data[i],minH,minS,stack)==false)
return false;
} }
return true;
}
private boolean Hold(int datum, int minH, int minS, ArrayStack<Integer> k) {
int bestTrack = -1;
int bestTop = Integer.MAX_VALUE;
for (int i = 0; i <k.getSize() ; i++) {
if(k.getSize()!=0){
int x = k.peek();
if(datum<x&&x<bestTop){
bestTop = x;
bestTrack = i;
}
}else{
if(bestTrack == -1){
bestTrack = i;
break;
}
}
}
if(bestTrack==-1){
return false;
}
k.push(datum);
if(datum<minH){
minH=datum;
minS=bestTrack;
}
return true;
}
private void output(int minH, int minS, ArrayStack<Integer> k) {
k.pop();
minH = Integer.MIN_VALUE;
minS = -1;
for (int i = 0; i <k.getSize() ; i++) {
minH = k.peek();
minS = i;
}
}