栈的应用

栈的应用1--递归

把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做递归函数。

写递归最怕的就是陷入永不结束的无穷递归中,所以,每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。


迭代和递归的区别是:迭代使用的是循环结构,递归使用的是选择结构。递归能是程序的结构更清晰,更简洁,更容易让人容易理解,从而减少读懂代码的时间。但是大量的递归调用会建立函数的副本,会大量消耗时间和内存。迭代则不需要反复调用函数和占用额外的内存。

用常规的迭代方法打印前40位的斐波那契数数列:

int main()
{
	int i;
	int a[40];
	a[0] = 0;
	a[1] = 1;
	printf("%d ", a[0]);
	printf("%d ", a[1]);
	for (i = 2; i < 40; i++)
	{
		a[i] = a[i -1] + a[i - 2];
		printf("%d ", a[i]);
	}
	return 0;
}

用递归方法实现:

int Fbi(int i)
{
	if (i < 2)
		return i == 0 ? 0 : 1;
	return Fbi(i - 1) + Fbi(i - 2);
}

int main()
{
	int i;
	for (i = 0; i < 40; i++)
		printf("%d ", Fbi(i));
	return 0;
}

栈与递归的关系:

在程序的前行阶段,对于每一层递归,函数的局部变量、参数值以及返回地址都被压入栈中。在退回阶段,位于栈顶的局部变量、参数值和返回地址被弹出,用于返回调用层次中执行代码的其余部分,也就是恢复了调用的状态。


栈的应用2--四则运算表达式求值

1、将中缀表达式转化为后缀表达式

我们平时使用的四则运算表达式,叫做中缀表达式,如:9 + (3 - 1) × 3 + 10 ÷ 2

中缀表达式“9 + (3 - 1) × 3 + 10 ÷ 2”转化为后缀表达式“9 3 1 - 3 * + 10 2 / +”

规则:从左到右遍历中缀表达式的每个数字和符号,若是数字则输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级不高于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。

2、将后缀表达式进行运算得出结果

规则:从左到右遍历表达式的每个数字和符号,遇到所数字就进栈,遇到符号就将处于栈顶的两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。



LIN协议是一种用于低成本、低速率串行网络的通信协议,主要应用于车辆电子系统中。以下是关于LIN协议应用的一些分享。 首先,LIN协议在车辆电子系统中常用于连接各种低速率从设备,如门控制单元、窗户控制单元、座椅控制单元等。通过LIN总线,这些从设备可以与车辆主控制单元进行通信和控制。相比于其他高速率通信协议,如CAN协议,LIN协议更适用于这些低速率从设备的通信需求。 其次,LIN协议具有较低的成本优势。由于LIN协议使用的是普通的串行通信线路,不需要专用的硬件设备支持,因此整体成本相对较低。这使得LIN协议在汽车电子系统中得到广泛的应用,特别是在非关键性应用中。 此外,LIN协议还具有较低的功耗。由于LIN协议使用的是低速率通信,通信过程中的能耗相对较低。这在需要长时间运行的系统中尤为重要,例如关闭引擎后仍需要继续运行的车辆电子系统。 最后,LIN协议还支持多主从架构。这意味着在LIN总线上可以连接多个主设备和从设备,实现复杂的通信和控制功能。这种灵活性使得LIN协议在车辆电子系统中能够满足不同设备之间的通信需求。 总之,LIN协议在车辆电子系统中应用广泛,并且具有成本低、功耗低和多主从支持等优势。随着车辆电子化的发展,LIN协议在汽车行业中的应用前景将更加广阔。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值