表达式去括号c语言,表达式去括号

本文介绍了一种改进的算法,用于处理字符串形式的算术表达式,特别关注嵌套括号和正负号的处理。作者分享了C++代码实现,展示了如何通过迭代和递归处理复杂括号结构,确保正确计算最终结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

date: 2018-9-15

昨天做了道算法题,感觉有点局限性,今天重新修改了下。

数据格式

类型:string,

样例

输入:a+b-(c+d+(e+f-(c+d))-(g-e))-d,没有空格,而且只有'+'、'-'、'('和')'。

输出结果:a+b-c-d-e-f+c+d+g-e-d。

代码

代码逻辑是:

从第一个字符开始处理,将非'('的保存到ss中,直到遇到'(';

调用process_bracket程序,继续处理后面的字符,直到遇到右括号,跳出循环;

由于存在嵌套的括号,所以根据ss最后一个符号来判断正负号;

如果是负号,则将'+'变成'-',将'-'变成'+',其余不变,保存到ss中;

如果是正号,不做处理,保存到ss中;

如果是左括号,迭代调用process_bracket程序。

#include

using namespace std;

void process_bracket(string::iterator &, string &);

string process_1(string expre) {

string ss;

// 从第一个开始处理,遇到'('号交给process_bracket,括号里的正负号由ss的最后一个字符决定

for (auto ci = expre.begin(); ci != expre.end(); ++ci) {

if (*ci != '(')

ss.push_back(*ci);

else

process_bracket(ci, ss);

}

return ss;

}

void process_bracket(string::iterator &is, string &ss) {

if (ss[ss.size()-1] == '-') { // 处理括号前是-号的情况,由于是可能存在嵌套括号,这里选择的是ss的正负号

is++;

while (*is != ')') { // 处理括号里面所有的字符

switch (*is) {

case '-':

ss.push_back('+');

break;

case '+':

ss.push_back('-');

break;

case '(': // 存在嵌套,迭代求解

process_bracket(is, ss);

break;

default:

ss.push_back(*is);

break;

}

++is;

}

} else { //处理括号前是+号的情况

is++;

while (*is != ')') {

switch (*is) {

case '(':

process_bracket(is, ss);

break;

default:

ss.push_back(*is);

break;

}

++is;

}

}

}

int main() {

string s("a+b-(c+d+(e+f-(c+d))-(g-e))-d");

cout << process_1(s);

return 0;

}

说明 很久就想编一个这样的计算器,只可惜一直没什么思路,最近突然灵感来了,所以就写下 这个程序。现在还在测试阶段,所以功能不是很完善。 程序功能:基本的表达式运算,可以自定义函数跟常量,分别保存在 “常数.txt” 和 “函数.txt”,方便自己添加。双击相应的函数名或常数名就可以将函数或常量添加到表达式中。 计算过程只能当表达式只有一行时有效。 实例1:计算sqr(19+tan(98)*tan(91)-sin(122)*(5*5-(19-11)))/2 计算过程sqr(19+tan(98)*tan(91)-sin(122)*(5*5-(19-11)))/2 =sqr(19+-7.11536972238419*tan(91)-sin(122)*(5*5-(19-11)))/2 =sqr(19+-7.11536972238419*-57.2899616307588-sin(122)*(5*5-(19-11)))/2 =sqr(19+-7.11536972238419*-57.2899616307588-.848048096156426*(5*5-(19-11)))/2 =sqr(19+-7.11536972238419*-57.2899616307588-.848048096156426*(5*5-8))/2 =sqr(19+-7.11536972238419*-57.2899616307588-.848048096156426*17)/2 =20.3032618253667/2 =10.1516309126834 实例2:计算 a=34 b=55 c=a+1 圆的面积(c) a*b c=a+b 圆的面积(c) 以下是计算结果: 圆的面积(c)=3848.4510006475 a*b=1870 圆的面积(c)=24884.5554090847 内置函数: !(x) - x 的阶乘 lg(x),log(x) 以10为底的对数 ln(x) 以 e为底x的对数 pow(x,y) x的y方次幂 prime(x) 判定x是否是素数,如果是直接将s2返回,否则将其各因子用连乘返回 sqr(x),sqrt(x) - x 的二次方根 arcsin(x) - x 的反正弦 arccos(x) - x 的反余弦 arcsec(x) - x 的反正割 arccsc(x) - x 的反余割 atn(x),arctg(x) - x 的反正切 arcctg(x) - x 的反余切 sin(x) - x 的正弦 cos(x) - x 的余弦 sec(x) - x 的正割 csc(x) - x 的余割 tg(x),tan(x) - x 的正切 ctg(x) - x 的余切 harcsin(x) - x 的反双曲正弦 harccos(x) - x 的反双曲余弦 harcsec(x) - x 的反双曲正割 harccsc(x) - x 的反双曲余割 harctg(x),harctan(x) - x 的反双曲正切 harcctg(x) - x 的反双曲余切 hsin(x) - x 的双曲正弦 hcos(x) - x 的双曲余弦 hsec(x) - x 的双曲正割 hcsc(x) - x 的双曲余割 htg(x),htan(x) - x 的双曲正切 hctg(x) - x 的双曲余切 有什么意见或建议可以跟我联系Email: ldm.menglv@gmail.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值