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

数据结构(C语言版)用顺序栈计算表达式

发布网友 发布时间:2022-05-09 22:20

我来回答

1个回答

热心网友 时间:2023-10-24 20:49

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>

typedef struct
{
char fun;
int grade;
}Functor;
//定义算符栈结构体
Functor FUNCTOR[20];
float NUM[20];
//定义算符栈和对象栈
char ch[100];
int sub=0;
//存放输入流的字符串

float Char_To_Num(){
//将表示数据的字符串转化成数据
int flag=0, i=-1;
float value=0.0;
while((ch[sub]>=48 && ch[sub]<=57) || ch[sub]=='.'){
if(ch[sub]=='.')
flag=1;
else{
if(flag==0) value=value*10+ch[sub]-48;
else{
value=value+( ch[sub]-48 )*pow(10,i);
i--;
}}
sub++;
}
return value;
}

int In_Grade(char c)
{ //算符在栈内时的级别
int g;
switch(c)
{
case '^': g=3;break;
case '*':
case '/':
case '%': g=2;break;
case '+':
case '-': g=1;break;
case '(': g=0;break;
case ')': g=-1;break;
}
return g;
}

int Out_Grade()
{ //算符在栈外时的级别
int g;
switch(ch[sub])
{
case '^': g=4;break;
case '*':
case '/':
case '%': g=2;break;
case '+':
case '-': g=1;break;
case '(': g=4;break;
case ')': g=-1;break;
}
return g;
}

void Error()
{
printf("输入的表达式有误!\n");
printf("\n按任意键退出");
getch();
exit(1);
}

void Calculate(int i, int j)
{
if(i>=2)
{ //判断对象栈中元素个数
switch(FUNCTOR[j-1].fun)
{
case '^': NUM[i-2]=pow(NUM[i-2],NUM[i-1]); break;
case '*': NUM[i-2]=NUM[i-2]*NUM[i-1]; break;
case '/': NUM[i-2]=NUM[i-2]/NUM[i-1]; break;
case '%': NUM[i-2]=int(NUM[i-2])%int(NUM[i-1]); break;
case '+': NUM[i-2]=NUM[i-2]+NUM[i-1]; break;
case '-': NUM[i-2]=NUM[i-2]-NUM[i-1]; break;
}
NUM[i-1]=0;
FUNCTOR[j-1].fun=0;
}
else Error();
//若对象栈若只剩一个数据,则输入的表达式有误
}

float Char_Transform(){
int i=0, j=0, grade, flag=0;
while( ch[sub]!='=' || j!=0 ){
if(ch[sub]=='='){
//输入的字符是否取完
Calculate(i, j);
i--;
j--;}
else{
if(ch[sub]>=48 && ch[sub]<=57){
//判断是否为运算对象
NUM[i++]=Char_To_Num();
if(flag){
NUM[i-1]=-NUM[i-1];
FUNCTOR[j-1].fun=0;
j--;
flag=0;
}}
else{
if(ch[sub]=='%' ||
(ch[sub]>=40 && ch[sub]<=43) ||
ch[sub]=='-' ||ch[sub]=='^' ||
ch[sub]=='/'){
//判断是否为算符
if( FUNCTOR[j-1].fun=='-' &&
FUNCTOR[j-2].fun=='(' &&
ch[sub]==')'){
//判断是否为负数
NUM[i-1]=-NUM[i-1];
FUNCTOR[j-1].fun=0;
FUNCTOR[j-2].fun=0;
j=j-2;
sub++;}
else{
if( FUNCTOR[j-1].fun== '(' && ch[sub]== ')' ){
//括号内表达式计算完后则将左括号从栈中去除
FUNCTOR[j-1].fun=0;
j--;
sub++;}
else{
grade=Out_Grade(); //栈外算符的级别
if(j==0 || grade>FUNCTOR[j-1].grade){
//第一个或级别比栈内算符高的进栈
FUNCTOR[j].fun=ch[sub];
FUNCTOR[j].grade=In_Grade(ch[sub]);
if(j==0 && FUNCTOR[j].fun=='-') flag=1;
j++;
sub++;}
else{
Calculate(i, j);
i--;
j--;
}}}}
else Error();
//表达式中有非算术字符,则表达式有误
}}}
return NUM[i-1];
}

void main()
{
float result;
printf("****************************************\n");
printf("请输入要求解的表达式,并以等号“=”结束:\n");
printf("****************************************\n");
gets(ch);
result=Char_Transform();
printf("%s%.2f\n", ch, result);
printf("\n按任意键退出");
getch();
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
有要业余时间弹古筝的酒店么 古筝演奏师的就业前景怎么样 茶馆里主要放的音乐类型是 日语一级的话什么水平啊 一级到底要求多少词汇啊? WPS右键菜单(win11) 再生缘 我的温柔暴君结局是什么啊?女主最后傻了? 为什么做爱多了没感情了 情侣之间在一起时间长了是不是做爱的时候也懒得接吻了直接进入主题吗... 夫妻性爱后为何丧失了热情 许巍的《曾经的你》QQ空间音乐链接 c++顺序栈的遍历怎么写,求大神 曾经的你,杭州站版本,mp3下载链接 632007107 c语言 栈的操作 请写出顺序栈的入栈函数,即往栈中插入元素e为新的栈顶元素 C语言数据结构栈的主函数怎么调用?主函数怎么写?下面是栈的部分程序,帮忙把主函数不出来吧 栈的表示与实现的主函数 C++顺序栈的主函数怎么写,我的程序的话主程序该怎么写 如何写数据结构中栈的顺序表示中主函数?我要的是C语言版的。例子... 埇桥区教育集团2021一2022学年度第一学期期中质量检测八年级生物试题卷_百度问一问 手机上怎么把两张图片合成一张 初二生物期中测试卷 宁波地铁一号线35kv环网电缆的型号规格为 地铁环网电缆支架无轨测量技术研究 什么是环网柜 环网柜与电缆分支箱有什么区别 请帮忙解释下什么是环网柜 33KV环网电缆搏设钢性固定是为了什么 什么是环网单元 什么是电力环网箱?环网箱具体是干什么的?和箱变的区别是什么? 有木有跟 曾经的你 这首歌风格差不多的 或者类似烟花易冷这种歌曲的 给老师们的诗歌以及祝福语 有首歌的歌词里有‘每次难过的时候,就独自看一看大海,总想起身边走在路上的朋友’歌名叫什么? 急求!!!金枝欲孽2[高清TV粤语]16(1)种子下载,感谢哈 2016浙江卫视跨年演唱会许巍曾经的你前奏钢琴那段音乐 邯郸市同心康维医药药材有限公司康维药房怎么样? 求朴树的一首歌名 得物的防盗扣怎么 这两年和近三年是什么意思 求数码宝贝所有主角合唱的歌曲和个人的角色歌曲!!! 数码宝贝第一季的所有歌曲名字? 数码宝贝第一,二部全部歌曲 求 数码宝贝 一、二、三部里出现的歌 数码暴龙的角色歌 太一和亚古兽的歌曲:Team 和 アクモンONDO 跪求数码暴龙的插曲和所有人的角色歌,请有的大人发到一下邮箱: loliboss@126.com 分不是问题的~~ 数码宝贝歌曲 数码宝贝第一部全部背景音乐 你好,我在知道看到你的·~。我想要数码宝贝的所有歌曲。275120362的qq邮箱!!麻烦你了~ 数码宝贝角色CD 小米手机如何进入开发者选项