栈的应用

  1. 括号匹配(使用了顺序栈)
    注:C语言中输出一个字符是 printf("m:%c\n",m);
          输出一个字符串是printf("L.data:%s\n",L.data);
  • 思路:三种异常情况: (1)数组中的括号与出栈的括号不匹配
                (2)数组中已无元素但栈中还有元素;
               (3)栈中已无元素但数组中还有元素;
  • 思路流程图:
    在这里插入图片描述
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
typedef struct zhnode
{
	char data[maxsize];
	int top;
 }zhnode,*zhlink;
 void init(zhnode &L)   //初始化 
 {
 	L.top=-1;
 }
 void enter(zhnode &L,char e) //进栈 
 {
 	L.data[++L.top]=e;
 }
 char out(zhnode &L)  //出栈 
 { 
 	char x=L.data[L.top--];
 	return x;
 }
 bool empty(zhnode L) //判断栈是否为空 
 {
 	if(L.top==-1)
 		return true;
 	else
 		return false;
 }
 bool match(char brack[],zhnode L)
 {
 	int i=0;
 	char m='a';
 //	printf("OK1!\n");
 //	printf("brack:%s",brack);
 	while(brack[i]!='\0')
	 {
	 //	printf("OK2!\n");
	 	if(brack[i]==')')
		 	m='(';
		else if(brack[i]==']')
		    m='[';
		else if(brack[i]=='}')
			m='{';
	 	if (brack[i]=='('||brack[i]=='['||brack[i]=='{')
	 	{
	 		enter(L,brack[i]);
	 	//	printf("L.data:%s\n",L.data);
		 }
		else 
		{
			if (empty(L)==true)
			  {
			  	printf("匹配失败!!\n");
	 			return false;
			  }
		//	printf("m:%c\n",m);
			char x=out(L);
		//	printf("x:%c\n",x);
			if(x!=m)
			{
				printf("匹配失败!!\n");
	 			return false;
	 	//		printf("ok!");
			}
		}
		i++;
	  } 
	  if (empty(L)!=true)
	  {
	  	printf("匹配失败!!\n");
	 	return false;
	  }
	  else
	  {
	  	printf("匹配成功!!\n");
	 	return true;
	  }
  } 
  int main()
  {
  	zhnode L;
  	char brack[10],b;
  	int i=0;
	scanf("%s",&brack);
  	init(L);
  	match(brack,L);
  	return 0;
   } 
 
  1. 数值进制转换(使用了顺序栈)
    函数:
void conversion(zhnode &L)
 {
 	int x,m;
 	printf("请输入x:\n");
 	scanf("%d",&x);
 	printf("请输入进制:\n");
 	scanf("%d",&m);
 	while(1)
 	{
 		int a=x%m;
 		enter(L,a);//进栈 
 		int b=x/m;
 		if(b==0)
 			break;
 		x=b;
	 }
  } 

整体代码:

#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
typedef struct zhnode
{
	int data[maxsize];
	int top;
 }zhnode,*zhlink;
 void init(zhnode &L)   //初始化 
 {
 	L.top=-1;
 }
 void enter(zhnode &L,int e) //进栈 
 {
 	L.data[++L.top]=e;
 }
 int out(zhnode &L)  //出栈 
 { 
 	char x=L.data[L.top--];
 	return x;
 }
 bool empty(zhnode L) //判断栈是否为空 
 {
 	if(L.top==-1)
 		return true;
 	else
 		return false;
 }
 void conversion(zhnode &L)
 {
 	int x,m;
 	printf("请输入x:\n");
 	scanf("%d",&x);
 	printf("请输入进制:\n");
 	scanf("%d",&m);
 	while(1)
 	{
 		int a=x%m;
 		enter(L,a);//进栈 
 		int b=x/m;
 		if(b==0)
 			break;
 		x=b;
	 }
  } 
 bool match(char brack[],zhnode L)
 {
 	int i=0;
 	char m='a';
 //	printf("OK1!\n");
 //	printf("brack:%s",brack);
 	while(brack[i]!='\0')
	 {
	 //	printf("OK2!\n");
	 	if(brack[i]==')')
		 	m='(';
		else if(brack[i]==']')
		    m='[';
		else if(brack[i]=='}')
			m='{';
	 	if (brack[i]=='('||brack[i]=='['||brack[i]=='{')
	 	{
	 		enter(L,brack[i]);
	 	//	printf("L.data:%s\n",L.data);
		 }
		else 
		{
			if (empty(L)==true)
			  {
			  	printf("匹配失败!!\n");
	 			return false;
			  }
		//	printf("m:%c\n",m);
			char x=out(L);
		//	printf("x:%c\n",x);
			if(x!=m)
			{
				printf("匹配失败!!\n");
	 			return false;
	 	//		printf("ok!");
			}
		}
		i++;
	  } 
	  if (empty(L)!=true)
	  {
	  	printf("匹配失败!!\n");
	 	return false;
	  }
	  else
	  {
	  	printf("匹配成功!!\n");
	 	return true;
	  }
  } 
  int main()
  {
  	zhnode L;
  	char brack[10],b;
  	int i=0;
//	scanf("%s",&brack);
  	init(L);
  	conversion(L);
  //	match(brack,L);
  	while(empty(L)!=true)
  	{
  		printf("%d",out(L));
	  }
  	return 0;
   } 
 
  1. 算术表达式
    (1)后缀表达式
    思路图:

在这里插入图片描述

char decide_prior(char a,char b)  //判断两个运算符的优先级 
 {
 	if(a=='+'||a=='-')
 	{
 		if((b=='*')||(b=='/'))
 			return '<';
 		if(b=='+'||b=='-')
 			return '=';
	 }
	 if(a=='*'||a=='/')
	 {
	 	if((b=='*')||(b=='/'))
 			return '=';
 		if(b=='+'||b=='-')
 			return '>';
	 }
 }
 void late_evalent(zhnode &L,char a[])  //后缀表达式 
 {
 	char resault[maxsize];
 	int j=0;
 	for(int i=0;a[i]!='\0';i++)
 	{
 		if((a[i]>=65&&a[i]<=90)||(a[i]>=97&&a[i]<=122))
 		{
 			resault[j++]=a[i];
 		//	printf("resault[%d]=%c\n",j-1,resault[j-1]);
 		//	printf("====================\n");
		 }
		 else if((a[i]>=40&&a[i]<=43)||(a[i]==45)||(a[i]==47))
		 {
		 	if(empty(L)==true)
		 	{
		 		
		 		enter(L,a[i]);
			 }
			 else  
			 {
			 	if(a[i]!='('&&a[i]!=')')
			 	{
			 		if (L.data[L.top]=='(')
			 		{
			 			enter(L,a[i]);
					 }
					 else
					 {
					 	while(decide_prior(L.data[L.top],a[i])=='>'||decide_prior(L.data[L.top],a[i])=='=')
					 		{
					 		resault[j++]=out(L);
					 	//	printf("resault[%d]=%c\n",j-1,resault[j-1]);
					 	//	printf("====================\n");
						 	}
						 	enter(L,a[i]);
					 	if(decide_prior(L.data[L.top],a[i])=='<')
					 	{
					 		enter(L,a[i]);
						 }
					 }
			 		
				 }
				 else
				 {
				 	if(a[i]=='(')
				 		enter(L,a[i]);
				 	else if(a[i]==')')
				 	{
				 		while(1)
				 		{
				 			char O1=out(L);
				 			if(O1!='(')
				 			{
				 				resault[j++]=O1;
				 		//		printf("resault[%d]=%c\n",j-1,resault[j-1]);
				 		//		printf("====================\n");
							 }
							 if(O1=='(')
							 {
							 	break;
							 }
						 }
					 }
				 }
			 }
		 }
	 }
	 while(empty(L)!=true)
	 {
	 	resault[j++]=out(L);
	 	printf("resault[%d]=%c\n",j-1,resault[j-1]);
	 	printf("====================\n");
	 	printf("%c\n",(L.data[L.top]));
	 }
	 for(int i=0;resault[i]!='\0';i++)
	 {
	 	printf("%c ",resault[i]);
	 }
	 printf("\n");
 }
  1. 递归
#include<stdio.h>
/*斐波那契数列 
int Fib(int n)
{
	if(n==0)
		return 0;
	else if(n==1)
		return 1;
   else if (n>1)
   return Fib(n-1)+Fib(n-2);
 } */
 /*阶乘*/ 
 int  factoria(int n)
 {
 	if(n==0||n==1)
 		return 1;
 	else
	 	return n*factoria(n-1);	
 }
 int main()
 {
 	//int n=Fib(3); //斐波那契数列 
 	int n2=factoria(3);//阶乘
 	printf("%d\n",n2); 
 	return 0;
 }
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、付费专栏及课程。

余额充值