问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

急求!!用数据结构的堆栈做出

发布网友 发布时间:2024-07-03 21:50

我来回答

1个回答

热心网友 时间:2024-07-04 19:15

程序设计语言随软件技术的发展而快速发展,是表达软件的工具,是人机通信的媒介。程序设计语言就是一台抽象机器,程序员利用这个抽象机器的各种功能(语言机制)编制出绘声绘色的软件。程序设计语言从极少数计算机专家知道的机器语言到数以万计的高级程序设计员,经历了从复杂到简单的设计过程。表达式计算是程序设计语言的基本知识,是编译系统的基本问题。然而在高级程序设计语言中,只要给出表达式,高级语言环境就会根据预设的语言机制计算出表达式的结果,编程人员并不了解表达式的计算过程。本文通过算符优先分析和堆栈的方法,给出了算术表达式的计算过程,有助于高级语言初学者和计算机编程人员熟悉计算机内部表达式计算的处理过程,更好地学习和掌握高级语言的编程技术。

2 表达式计算

2.1 算符优先分析
算符优先分析是定义算符之间的某种优先关系,这种关系可以为表示以下三种:
a<ba的优先性低于b
a=ba的优先性等于b
a>ba的优先性高于b
其中a和b代表一种算符,<、=和>不同于数学里的大于、等于和小于,同时a<b并不代表b>a, a=b并不代表b=a。
2.2 表达式表示
在机器内部,任何一个表达式都是由操作数、运算符和分界符组成,分界符表示一个表达式的结束。假设在此讨论的算符只含加、减、乘、除四种算术运算符和左、右圆括号。如一个算术表达式A+(B-C/D)*E,这种算术表达式中的运算符一般总是出现在两个操作数之间称中缀表达式。在计算机的编译系统中,在处理中缀表达式之前,总是先将它变换成后缀表达式,即表达式中的运算符出现在操作数之后,且不含括号。把一个中缀表达式变换成相应的后缀表达式首先考虑运算规则。算术运算的规则是:(1)先乘除后加减;(2)先括号内后括号外;(3)同级别时先左后右。则上面中缀表达式可写成ABCD/-E*+,由此可知后缀表达式的两个特点:(1)后缀表达式与中缀表达式的操作数先后次序相同,只是运算符的先后次序有所变化。后缀表达式的运算符次序就是其执行次序;(2)后缀表达式没有括号(如表1)。
表1 后缀表达式的处理过程
2.3 算符优先关系
由后缀表达式特点(1)知,后缀表达式与中缀表达式的操作数排列次序相同,只是运算符改变了次序。编译系统从左到右依次扫描中缀表达式,每读到一个操作数即将它作为后缀表达式的一部分输出。系统设置一个存放运算符的栈,初始时栈顶置一分界符#,并将其也看作运算符。每读到一个运算符,就将其优先级与栈顶位置运算符优先级进行比较,以决定是把所读的运算符进栈还是将栈顶位置的运算符作为后缀表达式的一部分输出。表2给出了包括加、减、乘、除四种算术运算符和左、右圆括号和分界符的算术运算符间的优先级关系表。表中θ1代表栈顶运算符,θ2代表当前扫描读到的运算符。
表2 运算符优先级关系
表2是四则运算三条规则的变形。对规则(1),当θ1为+或-,θ2为*或/时,θ1的优先级低于θ2的优先级(先乘除后加减);对规则(2),θ1当为+、-、*或/,θ2为(时,θ1的优先级低于θ2的优先级(先括号内后括号外);当θ1为+、-、*或/,θ2为)时,θ1的优先级高于θ2的优先级(先求出括号内的值);对规则(3),当θ1的运算符和θ2的运算符同优先级别时,令θ1的优先级高(同级别时先左后右)。由于后缀表达式无括号,当θ1为(,θ2为)时,用符号”=”表示去掉该对括号。当θ1为#时,θ2也为#时,表示整个表达式处理完毕。表2中空格处表示不允许出现这种情况,一旦出现,即为中缀表达式语法出错。
2.4 表达式计算
中缀表达式变换成相应的后缀表达式后,根据后缀表达式计算表达式的值方法为:设置一个足够大的堆栈,从前向后依次扫描后缀表达式,每读到一个操作数,就将其压入堆栈;每读到一个运算符,就从栈顶取出两个操作数施以该运算符所代表的操作,并把计算结果作为一个新的操作数压入堆栈,一直到后缀表达式读完。最后在栈顶位置的操作数就是该算术表达式的计算结果。

3 算法实现

#include
char newstr[20]; int p=0;
char proceed(char x1,char x2) /*算符比较*/
{char result1;
char Midstring[2];
result1='<';Midstring[0]=x2; Midstring[1]='\0';
if(((x1=='+'||x1=='-')&&strstr("+-)#",Midstring)!=-1)
||((x1=='*'||x1=='/')&&strstr("+-*/)#",Midstring)!=-1)
||(x1==')'&&strstr("+-*/)#",Midstring)!=-1))
result1='>';
else if((x1=='(' && x2==')')||(x1=='#' && x2=='#'))
result1='=';
else if((x1=='(' && x2=='#')||(x1==')' && x2=='(')||(x1=='#' && x2==')'))
result1=' ';
return(result1);}
int strstr(char str1[],char str2[])
{int i,j,k,m,n;
char tempStr1,tempStr2;
m=strlen(str1);
n=strlen(str2);
for(i=0;i {k=i;
for(j=0;j<1;j++,k++)
{tempStr1=str1[k];
tempStr2=str2[j];
if(tempStr1==tempStr2)
continue;
else break;}
if(j>=n) return(1);}
return(-1);}
/*中缀表达式变换后缀表达式*/
intprotfix(char str[])
{char stack[20];
char x1,x2,x;
int j=0,k=0;
stack[0]='#';
x2=str[j];
x1=stack[0];
while(1)
{if(x2!='+'&&x2!='-'&&x2!='*'&&x2!='/'&&x2!='('&&x2!=')'&&x2!='#')
{newstr[p++]=x2;
j++;x2=str[j];}
else

本文原文
if(proceed(x1,x2)=='<')
{stack[++k]=x2;
x1=stack[k];
j++; x2=str[j];
}else if(proceed(x1,x2)=='>')
{ x=stack[k--];
newstr[p++]=x;
x1=stack[k];}
else if(proceed(x1,x2)=='='&&x1=='('&&x2==')')
{k--;x1=stack[k];
j++;x2=str[j]; }
Else
if(proceed(x1,x2)=='='&&x1=='#'&&x2=='#')
return(1);
else if(proceed(x1,x2)= =' ')
break;}
return(0);}
double count(char str[])/*计算表达式的值*/
{double x1,x2,x; int a,i=0;
while(str[i]!='\0')
{if(isdigit(str[i]))
push(str[i]-48);
else
Switch(str[i])
{case '+': x1=pop();x2=pop();
x=x1+x2;push(x);break;
case '-': x1=pop();x2=pop();
x=x1-x2;push(x);break;
case '*': x1=pop();x2=pop();
x=x1*x2;push(x);break;
case '/': x1=pop();x2=pop();
x=x1/x2; push(x); break; }
i++;}}
return(x);}

4 结束语

表达式计算作为程序设计语言的基础,是高级程序设计语言学习者和程序员必备的基础知识,本文通过算符优先分析和堆栈的方法,给出了算术表达式的计算过程,同时给出了算法描述,有助于高级语言初学者和计算机编程人员熟悉计算机内部表达式计算的处理过程,更好地学习和掌握高级语言的编程技术。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
美的燃气热水器12升电脑版显示FR一pH一PL一dH一nE一qU怎么调好_百度知... 热水器ph什么意思 上海工程技术大学公共管理专业是什么学院 公共事业管理在暨南大学中属于哪个学院? 中央财经大学公共事业管理学生就业去向都有哪些 中飞院公共事业管理是什么专业 广西医科大学公共事业管理属于哪个学院 抖音怎么发视频@抖音小助手 发视频@抖音小助手操作一览 轻颜相机怎么取消自动续费 取消自动续费教程 轻颜相机vip怎么取消 给大家揭秘一下一比一精仿阿玛尼手表,价格大概多少 2024最旺的生肖2024年运气最旺的三大生肖? 2024年5月24日危日最旺的生肖 多少天洗个头既干净又健康? 猫咪落地的时候哼一声 数学题目,看谁算的准确 怎样将Excel表格导出成PDF格式? mac电脑如何打开excel文件格式(mac电脑怎么用excel) word文档怎么把两列分为两页word文档怎么把两列分为两页并排 请问峨眉山那个四面佛下面一个门进去压了一个什么佛象?表示什么意思... 荨麻疹可以吃朗迪巧碳酸钙d3片吗??我得了急性荨麻疹,下面的医生给_百度... 小明与公司签订劳动合同,月薪:基本工资5000元,住房津贴2000元,绩效500... 英国留学党9月份已经回国还退了税,12月份还想去参加毕业典礼,怎么... 怎样阻止洋葱学院被打电话 天津市的保险“五险一金”现在扣个人部分最低是多少钱? 高仿、精仿浪琴一比一质量怎么样?什么价位? 金刚藤头泡酒的功效 ...元。公司应该给我多少保险补贴,北京最低保险基数为多少 深圳十级伤残赔偿标准,公司买的保险应该是最低档的能赔多少,厂里又赔... word文档怎么设置一排两页word文档怎么设置一排两页并排 如何阻止洋葱数学打来电话 有什么比较好用的买菜app 奔跑吧急救医生什么时候播出 李宏伟云彩剪辑师美文摘抄 几天洗个头对头发有好处? 几天洗个澡洗个头 销售成立的标志是什么?在不同结算和销售方式下,如何确定销售实现?_百度... 请问浙一拔牙是微创拔牙吗 医生说要拔智齿,第二颗能 十八种氨基酸与十七种氨基酸的主要区别是什么? 梦见卖掉三只酒杯的预兆 水渠没挖却要引水嘛 黑龙江省七台河市茄子河区黑龙江红兴隆农垦宝利采金下辖村委会有哪些... 和苦瓜一样里面是红心的水果是什么? ...和氢氧化铝(分析纯)配置100ML 偏铝酸钠 苟性比值为2.1 。 三只啤酒杯里分别加入1/4、1/2、3/4的水,用铅笔敲,听听声音有何不同... 骨结核阴性吃药期间可以上班吗? 我以前得过骨结核,吃药一年半了,生病的关节恢复正常了,也不疼。可是... 骨结核怎么治疗 吃药多长时间能治愈 骨结核病人吃药久了为什么会吐 离婚后多久可登记呢