栈的应用

 

style="WIDTH: 89.81%; HEIGHT: 64px" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-4577827332549849&dt=1192819750500&lmt=1192819750&prev_fmts=468x60_as&format=468x15_0ads_al_s&output=html&correlator=1192819750437&channel=1741427766&pv_ch=1741427766%2B&url=http%3A%2F%2Fyzkzoo.5d6d.com%2Fthread-68-1-1.html&color_bg=FFFFFF&color_text=000000&color_link=0000FF&color_url=008000&color_border=336699&ref=http%3A%2F%2Fyzkzoo.5d6d.com%2Fforum-16-1.html&cc=100&ga_vid=1025434795.1192631677&ga_sid=1192817968&ga_hid=1871659779&ga_fc=true&flash=8&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_his=2&u_java=true">

style="WIDTH: 44.33%; HEIGHT: 259px" src="http://pagead2.googlesyndication.com/cpa/ads?client=ca-pub-4577827332549849&cpa_choice=CAEaCB94-nvUZWENUB9QugJQtwRQTVAgULcCUB4&oe=gb2312&dt=1192720966468&lmt=1192720966&format=250x250_as&output=html&correlator=1192720966453&channel=2735220158&url=http%3A%2F%2Fyzkzoo.5d6d.com%2Fthread-67-1-1.html&color_bg=FFFFFF&color_text=000000&color_link=0000FF&color_url=008000&color_border=336699&ad_type=text_image&region=_google_cpa_region_&ref=http%3A%2F%2Fyzkzoo.5d6d.com%2Fforum-16-1.html&cc=100&ga_vid=1025434795.1192631677&ga_sid=1192720940&ga_hid=1155529757&ga_fc=true&flash=8&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_his=2&u_java=true">一、栈应用之一:数制转换

将十进制数转换成其它进制的数有一种简单的方法:

例:十进制转换成八进制:(66)10=(102)8

66/8=8 余 2

8/8=1 余 0

1/8=0 余 1

结果为余数的逆序:102 。先求得的余数在写出结果时最后写出,最后求出的余数最先写出,符合栈的先入后出性质,故可用栈来实现数制转换:

void conversion() {

pSqStack S;

SElemType e;

int n;

InitStack(&S);

printf("Input a number to convert to OCT:/n");

scanf("%d",&n);

if(n<0)

{ printf("/nThe number must be over 0.");

return;}

if(!n) Push(S,0);

while(n){

Push(S,n%8);

n=n/8; }

printf("the result is: ");

while(!StackEmpty(*S)){

Pop(S,&e); printf("%d",e);}

}


请看:数制转换的C源程序

二、栈应用之二:行编辑

一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区。允许用户输入出错时可以及时更正。可以约定#为退格符,以表示前一个字符无效,@为退行符,表示当前行所有字符均无效。

例:在终端上用户输入为

whli##ilr#e(s#*s) 应为

while(*s)

void LineEdit() {

pSqStack S,T; char str[1000];

int strlen=0; char e; char ch;

InitStack(&S);

InitStack(&T);

ch=getchar();

while(ch!=EOFILE) {

while(ch!=EOFILE&&ch!='/n') {

switch(ch){

case '#': Pop(S,&ch); break;

case '@': ClearStack(S); break;

default: Push(S,ch); break; }

ch=getchar();

}

if(ch=='/n') Push(S,ch);

while(!StackEmpty(*S)) { Pop(S,&e); Push(T,e); }

while(!StackEmpty(*T)) { Pop(T,&e); str[strlen++]=e; }

if(ch!=EOFILE) ch=getchar();

}

str[strlen]='/0';

printf("/n%s",str);

DestroyStack(S);

DestroyStack(T);

}

 


请看:行编辑的C源程序

三、栈应用之三:表达式求值

一个程序设计语言应该允许设计者根据需要用表达式描述计算过程,编译器则应该能分析表达式并计算出结果。表达式的要素是运算符、操作数、界定符、算符优先级关系。例:1+2*3有+,*两个运算符,*的优先级高,1,2,3是操作数。 界定符有括号和表达式结束符等。

算法基本思想:

1首先置操作数栈为空栈,表达式起始符#为运算符栈的栈底元素;

2依次讲稿表达式中每个字符,若是操作数则进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕。

char EvaluateExpression() {

SqStack *OPND,*OPTR;

char c,x,theta; char a,b;

InitStack(&OPTR); Push(OPTR,'#');

InitStack(&OPND);

c=getchar();

while(c!='#'||GetTop(*OPTR)!='#') {

if(!In(c,OP)) {Push(OPND,c);c=getchar();}

else

switch(Precede(GetTop(*OPTR),c)) {

case '<': Push(OPTR,c); c=getchar(); break;

case '=': Pop(OPTR,&x); c=getchar(); break;

case '>': Pop(OPTR,&theta);

Pop(OPND,&b); Pop(OPND,&a);

Push(OPND,Operate(a,theta,b));

break;

}

}

c=GetTop(*OPND);

DestroyStack(OPTR);

DestroyStack(OPND);

return c;

}


请看:表达式求值的C源程序

四、总结

栈的先进后出、后进先出的特性。

style="WIDTH: 52.39%; HEIGHT: 263px" src="http://pagead2.googlesyndication.com/cpa/ads?client=ca-pub-4577827332549849&cpa_choice=CAEaCKcC4yuPlq5lUDRQDVAtUK4BUENQCA&oe=gb2312&dt=1192819388296&lmt=1192819388&format=300x250_as&output=html&correlator=1192819388281&channel=2735220158&url=http%3A%2F%2Fyzkzoo.5d6d.com%2Fviewthread.php%3Ftid%3D70%26page%3D1%26extra%3Dpage%253D1&color_bg=FFFFFF&color_text=000000&color_link=0000FF&color_url=008000&color_border=336699&ad_type=text_image&region=_google_cpa_region_&ref=http%3A%2F%2Fyzkzoo.5d6d.com%2Fpost.php%3Faction%3Dedit%26fid%3D16%26tid%3D70%26pid%3D70%26page%3D1%26extra%3Dpage%253D1&cc=100&ga_vid=1025434795.1192631677&ga_sid=1192817968&ga_hid=1527165455&ga_fc=true&flash=8&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_his=5&u_java=true">

style="WIDTH: 82.23%; HEIGHT: 74px" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-4577827332549849&dt=1192818497343&lmt=1192818497&format=468x60_as&output=html&correlator=1192818497343&channel=1741427766&url=http%3A%2F%2Fyzkzoo.5d6d.com%2Fthread-68-1-1.html&color_bg=FFFFFF&color_text=000000&color_link=0000FF&color_url=008000&color_border=336699&ad_type=text_image&ref=http%3A%2F%2Fyzkzoo.5d6d.com%2Fforumdisplay.php%3Ffid%3D16%26page%3D1&ui=rc%3A6&cc=100&ga_vid=1025434795.1192631677&ga_sid=1192817968&ga_hid=1000484876&ga_fc=true&flash=8&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_his=6&u_java=true">

style="WIDTH: 58.41%; HEIGHT: 156px" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-4577827332549849&dt=1192819750656&lmt=1192819750&prev_fmts=468x60_as%2C468x15_0ads_al_s%2C234x60_as&format=200x90_0ads_al_s&output=html&correlator=1192819750437&channel=1741427766&pv_ch=1741427766%2B&url=http%3A%2F%2Fyzkzoo.5d6d.com%2Fthread-68-1-1.html&color_bg=FFFFFF&color_text=000000&color_link=0000FF&color_url=008000&color_border=336699&ref=http%3A%2F%2Fyzkzoo.5d6d.com%2Fforum-16-1.html&cc=100&ga_vid=1025434795.1192631677&ga_sid=1192817968&ga_hid=1871659779&ga_fc=true&flash=8&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_his=2&u_java=true"> 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值