资讯动态

C++表达式求值详解

发布时间:2026/10/14 17:46:56 来源:尧图企业网站定制
一.细节处理:1.注意负数 因此要进行字符串预处理12345678910111213string format(string str){intlen str.length();for(inti 0; i len; i){if(str[i] -){if(i 0) { str.insert(0, 1,0); }//处理-3*21情况elseif(str[i - 1]() { str.insert(i, 1,0); }//处理-3*41情况}}returnstr;}2.考虑除数为01234case/:if(0 ! y) { res x / y; }else{ cout 非法表达式;return-1; }break;3.原字符串再加上一个定界符 #1strstr#4.优先级:1.(未入栈前为3 入栈后为0 2.”)和#为0 3.” -为1 4.”*和/为2二.知识要点:中缀表达式转为后缀表达式1. 首先设置存储运算符和存储操作数两个栈 即Symbol[N]和Num[N]且分别对应top2,top11top1-1 Symbol[0]#//运算符栈设置定界符 top202.入栈和出栈的规则 字符串为str一.若str[i]0str[i]9,则入操作数栈并继续扫描以一个字符 即Num[top1]str[i]-0;二.否则 将当前字符str1与运算符栈的栈顶元素str2进行优先级比较 ,自写比较函数例如: str1‘ 则若str2# ,(,) 则返回1 说明str1比str2优先级高1. 此时若str1优先级大于str2 则将str1入运算符栈并继续扫描 即 Symbol[top2]str[i]2.优先级相等则返回0 此时将运算符栈顶元素弹出,并继续扫描下一个字符即 top2-- i3.若str1优先级小于str2返回-1此时将运算符栈顶元素弹出 即opSymbol[top2--]并弹出操作数栈的两个元素 即yNum[top1--],xNum[top1--] 之后进行计算操作三.最后 return Num[top1]三.完整源码:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116#define _CRT_SECURE_NO_WARNINGS#includebits/stdc.husingnamespacestd;classExpression{public:Expression(string str);~Expression();intCompute();private:intComp(charstr1,charstr2);string str1;};Expression::Expression(string str){this-str1 str #;//以定界符开头}Expression :: ~Expression() {}//将中缀表达转为后缀表达intExpression::Compute(){intNum[100], Symbol[100];//定义存操作数和运算符的两个栈inti, k, x, y, res;charop;Symbol[0] #;inttop1 -1, top2 0;for(i 0; str1[i] !\0;){if(str1[i] 0 str1[i] 9) { Num[top1] str1[i] -0; }else{//非操作数就比较运算符优先级intcmp Comp(str1[i], Symbol[top2]);if(cmp 1) { Symbol[top2] str1[i]; }//将运算符入栈 并接着扫描下一个字符elseif(cmp 0) { --top2; i; }//优先级相等 弹栈 并接着扫描下一个字符else{//优先级低 继续处理当前运算符y Num[top1--];//后面的数要先弹出来 才不会算反x Num[top1--];op Symbol[top2--];switch(op){case:res x y;//将运算结果入栈break;case-:res x - y;break;case*:res x * y;break;case/:if(0 ! y) { res x / y; }else{ cout 非法表达式;return-1; }break;default:break;}Num[top1] res;}}}returnNum[top1];}string format(string str){intlen str.length();for(inti 0; i len; i){if(str[i] -){if(i 0) { str.insert(0, 1,0); }//处理-3*21情况elseif(str[i - 1]() { str.insert(i, 1,0); }//处理-3*41情况}}returnstr;}intmain(){string str;intn 3;while(n--){cout 请输入一个表达式: endl;cin str;str format(str);Expression E(str);intresult E.Compute();cout 表达式的值的是: result endl;}return0;}intExpression::Comp(charstr1,charstr2)//当前字符元素和栈顶运算符优先级比较{//1代表 str1优先级大于str2 0 代表相等 -1代表小于switch(str1){case:case-:if(str2 #||str2)||str2() {return1; }//左括号入队列后优先级变为0else{return-1; }break;case*:case/:if(str2 *|| str2 /) {return-1; }else{return1; }break;case(:return1;break;case):if(str2 () {return0; }elseif(str2 #) {return1; }else{return-1; }break;case#:if(str2 #) {return0; }else{return-1; }break;default:break;}}四.测试结果:总结本篇文章就到这里了希望能够给你带来帮助

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑