栈的使用(3)-走楼梯问题

走楼梯问题:

有n阶台阶,每次只可以走1阶或2阶,有多少中走法?

可以用递归实现:

如果对递归比较的熟悉的话,可以很快将递归的代码转化成非递归的;

#include "stdio.h"
#include "1.h"
int count = 0;
int count2 = 0;
//将上面的递归的改成用栈来实现!
void result3 (int n,int i) {
	if (i>=n) {
		count++;
	}else {
		result3(n,i+1);
		result3(n,i+2);
	}
}

//求栈的和值
int sum (LinkStack &list) {
	int sum = 0;          
	LinkStack p = list;
	while (p!=NULL) {
		sum = sum + p->data;
		p = p->next;
	}
	return sum;
}

//第一部压入1的情况n;
//第二部压入2的情况n-1;
void result1 (int n) {
	LinkStack stack = NULL;
	int temp;;
	push(stack,1);
	while (stack!=NULL) {
		while (sum(stack)< n) {
			push(stack,1);
		}
		if (sum(stack) ==n) {
			count2++;
		}
		if ((getTop(stack) ==1)&&(getTop2(stack)==1)) {
			pop(stack,temp);
			pop(stack,temp);
		}else if (getTop(stack)==1&&getTop2(stack)==2) {
			pop(stack,temp);
			pop(stack,temp);
			while (getTop(stack) == 2) {
					pop(stack,temp);
			}
			pop(stack,temp);
		}else if (getTop(stack)==2) {
			pop(stack,temp);
			while (getTop(stack) ==2) {
				pop(stack,temp);
			}
			pop(stack,temp);
		}
		if (stack!=NULL) {
			push(stack,2);
		}
	}
}
//n还是台阶数
void result2 (int n) {
	result1(n);
	result1(n-1);
}
void main () {
	LinkStack stack = NULL;
	printf("递归的算法的结果:\n");
	result3(10,1);//递归算法
	printf("%d\n",count);
	result2(10);//非递归算法
	printf("非递归的算法的结果是:\n");
	printf("%d\n",count2);
	return;
}


1.h文件是:

#include "stdio.h"
#include "stdlib.h"
typedef int ElemType;
typedef struct StackList {
	struct StackList *next;
	ElemType data;
}StackList,*LinkStack;

void push (LinkStack &l,ElemType e) {
	LinkStack q = (LinkStack)malloc(sizeof(StackList));
	q->data = e;
	q->next = l;
	l = q;
}

int getTop(LinkStack s) {
	if (s==NULL) {
		return -1;
	}
	return s->data;
}


int getTop2 (LinkStack &s) {
	if (s==NULL) {
		return -1;
	}
	if (s->next!=NULL) {
		 return s->next->data;
	}
	return -1;
}
void toString (LinkStack s) {
	if (s == NULL) {
	printf("是空的栈");
	return;
	}
	printf("栈中的元素从栈顶到栈尾依次是:\n");
	while (s!=NULL) {
	 printf("%d\n",s->data);
	 s = s->next;
	}

}

void pop(LinkStack &s,ElemType &e) {
	if (s == NULL) {
		return;
	}
	LinkStack l = s;
	s = s->next;
	e = l->data;
	free(l);
}

运行的结果是:

递归的算法的结果:89;

非递归的算法的结果:89;

一般情况下:递归的算法也可以转化成用迭代来解;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值