递归-G-递归实现栈转换

package f_recursion.G_stackTriangle;


/**
 * 封装返回地址和方法参数
 * 
 * @author Administrator
 *
 */
public class Params {
public int n;
public int returnAddress;


public Params(int n, int returnAddress) {
this.n = n;
this.returnAddress = returnAddress;
}


}package f_recursion.G_stackTriangle;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


/**
 * 栈三角应用
 * 递归实现栈转换
 * @author Administrator
 *
 */
public class StackTriangleApp {
static int theNumber;// 三角值
static int theAnswer;// 答案
static StackX theStackx;// 栈
static int codePart;// case条件
static Params theseParams;// 参数


public static void main(String[] args) throws IOException {
System.out.print("Enter a number: ");
theNumber = getInt();
recTriangle();
System.out.println("Triangle = " + theAnswer);
}


private static void recTriangle() {
theStackx = new StackX(10000);
codePart = 1;
while (step() == false) {


}
}


private static boolean step() {
switch (codePart) {
case 1:// 初始调用
theseParams = new Params(theNumber, 6);
theStackx.push(theseParams);
codePart = 2;
break;
case 2:
theseParams = theStackx.peek();
if (theseParams.n == 1) {
theAnswer = 1;
codePart = 5;
} else {
codePart = 3;
}
break;
case 3://入栈操作
Params newParams = new Params(theseParams.n - 1, 4);
theStackx.push(newParams);
codePart = 2;
break;
case 4:// 计算
theseParams = theStackx.peek();
theAnswer = theAnswer + theseParams.n;
codePart = 5;
break;
case 5://退出方法
theseParams = theStackx.peek();
codePart = theseParams.returnAddress;//4 or 6
theStackx.pop();
break;
case 6:
return true;
}
return false;
}


public static int getInt() throws IOException {
return Integer.parseInt(getSting());
}


private static String getSting() throws IOException {
return new BufferedReader(new InputStreamReader(System.in)).readLine();
}


}package f_recursion.G_stackTriangle;


/**
 * 栈操作
 * 
 * @author Administrator
 *
 */
public class StackX {
private int maxSize;
private Params[] stackArray;
private int top;


public StackX(int s) {
maxSize = s;
stackArray = new Params[maxSize];
top = -1;
}


public void push(Params p) {
stackArray[++top] = p;
}


public Params pop() {
return stackArray[top--];
}


public Params peek() {
return stackArray[top];
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值