首页 > 编程知识 正文

后缀表达式求值怎么算,基于栈的中缀算术表达式求值

时间:2023-05-04 09:01:05 阅读:22368 作者:1471

主题描述在一个表达式中,只有“0-9”、“”、“-”、“*”、“/”和“^”需要表达式的值。 () ) /除以整数。

输入格式:的总计一行,即公式。 (公式长度=30其中所有数据在0(2) 31-1的范围内。

输出格式:是表达式的值。

输入示例:在此处提供一系列输入。 例如:

1(3)2)7^2 69 )/(2) ) ) ) ) ) )。

输出样本333到360现在提供对应的输出。 例如:

258

基本思路:读取字符串后扫描一次,扫描一次后运算也同时结束。 中途将骑马订公式转换为后缀公式,边转换边计算。

1 .遇到数字后,开始将数字放在数字堆栈上(考虑多位的情况) )。

2 .如果碰到「()”直接进入符号堆栈

3 .遇到运算符时,如果其优先级大于符号堆栈中最高元素的优先级,则进入堆栈;

否则,首先计算符号堆栈的顶元素和数字堆栈的顶元素的运算结果

特别是,如果数字堆栈中的元素小于2,则任何运算符都会直接进入堆栈。)

4 .符号堆栈最上面的元素碰到「()”,开始从两个堆栈中提取元素,计算结束后也提取“)”,表示括号内的表达式作为一个结果计算出来

5 .特别是," ^ "的优先次序大于" "和"/"。 (比较723和7 ^23之间的差异) ) ) ) )。

6 .更详细的信息可以在代码和注释中找到

代码以下是我的代码。 使用了非常基础的方法。 代码本身非常容易理解,并得到了适当的评论。 非常适合想知道这种解决问题的想法的朋友。

# include stdio.h # include string.h # include stdlib.h # include math.hint in (charch )//判断是否为数字函数) if (ch=' ' (intcal ) int b、char c、int b ) /计算函数) if ) c=='* ' ) {return a*b; }elseif(c=='/' ) {return a/b; }elseif(c=='-' ) {return a-b; }elseif(c==' ' ) {return a b; }else{returnpow(a,b ); }intcom(chara,char b ) /比较运算符的优先级) {int x=0; //a的优先顺序int y=0; //b的优先级if(a==''|a=='-' ) x=1; }elseif(a=='*'|a=='/' ) x=2; }elseif(a=='^ ' ) x=3; }elseif(a==' () ) x=4; (if ) b==''|b=='-' ) y=1; }elseif(b=='*'|b=='/' ) y=2; }elseif(b=='^ ' ) y=3; }elseif(b==' () ) y=4; (if ) xy )返回1; 返回0; (}int main ) ) {char s[310]; //主串int num[310]; //数字堆栈char ch[310] //运算符堆栈gets(s; int a,b; a=0; //数字堆栈的堆栈前b=0; //符号堆栈的堆栈顶部for(intI=0; i310; I({num[I]=0; ch[i]='0'; (}int i=0; while(Istrlen(s ) ) if(in ) s (I ) ) while(s ) I ) /如果数字进入数字堆栈字符并被转换为数字(num[a]=num[a]*10s[I] (a ) //printf('%d%d )、num[a-2]、num[a-1] ); //for(intk=0; 国安; k(//)/printf ) ' %c ',ch[k]; //printf (() ) (n ) ); 继续; }else{if(s[I]==' () ) /左括号时直接堆栈({ch[b ]=s[i]; }elseif(s[I]==' () ) ) /方括号中的表达式) while(ch[B-1]!=' (() ) ) /计算)//printf )、num[a-2]和num[a-1] ),直到找到匹配的左括号; //for(intk=0; 国安; k(//)/printf ) ' %c ',ch[k]; //printf (() ) (n ) ); num[a-2]=cal(num[a-2],ch[b-1],num[a-1]; //更新为数字堆栈上一个数字计算结果的num[a-1]=0; //当数字堆栈的顶级元素消失时,将其设为零。 否则,会影响之后的运算。 上一个转换数字循环开始时的num[a]=num[a]*10 s[i ]-'0'; 默认num[a]的初始值为0 b--; //符号堆栈为一格a----; //数字堆栈返回一帧(B----; //计算括号中的表达式后,删除左括号}//运算符else{if(b==0)//如果符号堆栈为空,则直接进入堆栈({ch[b ]=s[i]; }elseif(com(s[I],ch[b-1] ) /如果当前运算符的优先级大于堆栈顶部运算符的优先级,则直接堆栈ch[b ]=s[i]; }else //结果现在可以在当前运算符的优先级小于堆栈顶部运算符的优先级的说明中计算{while (! com(s(I ),ch(B-1) ) if (ch ) B-1)==' () ) {break; (/printf('%d%d )、num[a-2]、num[a-1] ); //for(intk=0; 国安; k(//)/printf ) ' %c ',ch[k]; //printf (() ) (n ) ); num[a-2]=cal(num[a-2],ch[b-1],num[a-1]; //更新为数字堆栈上一个数字计算结果的num[a-1]=0; B----; //符号堆栈为一格a----; //数字堆栈一格if(b==0) break; //如果运算符堆栈为空,则无法计算并直接跳出循环(}ch[b ]=s[i]; //计算结束后可以放入这个运算符} I; (while(a!=1b0) ) /遍历整个字符串后,如果两个堆栈尚未空闲,则继续(如果数字堆栈中只剩下一个数字或运算符堆栈中没有符号,则停止计算) num [ a-2 ]=cal (num [ a a----; B----; //由于不再堆叠新数字,因此不需要再为num [ a-1 ]=0} printf (' % d ',num[0]; //输出(诶,对完全不懂算法的菜鸡来说这样的问题就是拷问。 在此特别感谢大人物ATFWUS和sky~key的帮助

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。