Stack应用====表达式计算(中缀变后缀)

诸如1+2*(3-4)+5的简单表达式

运算符在操作数之间,称为中缀表达式,中缀表达式具有不同的优先级,求值过程无法从左到右进行。

可把中缀表达式转换为后缀表达式计算。

算法如下:

             1.设置一个运算符栈,从左到右对每个字符进行处理。

              2.遇到左括号 ' '(直接入栈

              3.遇到数字,原样输出。

              4.遇到运算符,如果栈顶元素的优先级低,则入栈,否则出栈,直到栈顶元素优先级低,入栈。

              5.遇到右括号")",运算符出栈,直到出栈运算符为左括号,表示一对括号匹配。

              6.重复以上步骤,直到表达式结束,将栈中元素全部出栈。

1+2*(3-4)+5 ======> 1@2@3@4-*+5+  数字之间用@字符隔开


char*& toPosfix(char* str)//函数功能 中缀转后缀
{                //1+2*(3-4)+5
                 //1@2@3@4-*+5+
    stack<char> sc;
    int i=0;
    int j=0;
    char* pos = new char [2*strlen(str)];
    while(str[i]!='\0')
    {
        if(str[i]>='0'&&str[i]<='9')
            pos[j++]=str[i++];
        switch(str[i])
        {
        case '+':
        case '-':if(sc.size()==0||sc.top()=='(')
                   {
                       sc.push(str[i++]);
                       pos[j++]='@';
                       break;
                   }
                  while(sc.size()!=0&&sc.top()!='(')
                  {
                      pos[j++]=sc.top();
                      sc.pop();
                  }
                  sc.push(str[i++]);
                  break;

        case '*':
        case '/':if(sc.size()==0||sc.top()=='('||sc.top()=='+'||sc.top()=='-')
                    {
                        sc.push(str[i++]);
                        pos[j++]='@';break;
                    }
                 while((sc.size()!=0)&&(sc.top()=='*'||sc.top()=='/'))//注意短路效应
                 {                                              //sc.size()==0,sc.top()错误
                     pos[j++]=sc.top();
                     sc.pop();
                 }
                 sc.push(str[i++]);
                 break;
        case '(':sc.push(str[i++]);break;
        case ')':while(sc.top()!='(')
                 {
                    pos[j++]=sc.top();
                    sc.pop();
                 }
                 sc.pop();i++;break;
        default: break;

        }

    }
    while(sc.size()!=0)
    {
        pos[j++]=sc.top();
        sc.pop();
    }
    pos[j]='\0';

    return pos;

}


 后缀表达式求值

算法如下:

从左到右对后缀表达式进行处理,每次处理一个字符。

遇到数字,转为整数,入栈

遇到运算符,出栈两个值进行运算,运算结果继续入栈。

重复以上步骤。


int value(char* p)
{
    int i=0;
    int res=0;
    int flag=0;
    stack<int> si;
while(p[i]!='\0')
{

    while(p[i]>='0'&&p[i]<='9')
    {
        res=res*10+p[i]-'0';
        i++;
        flag=1;
    }
    if(p[i]=='@')
    {
        si.push(res);
        res=0;
        i++;
        flag=0;
    }
    else
    {
        if(flag==1)
        {
            si.push(res);
        }
        switch(p[i++])
        {
            case '+':res=si.top();si.pop();res=si.top()+res;si.pop();si.push(res);res=0;flag=0;break;
            case '-':res=si.top();si.pop();res=si.top()-res;si.pop();si.push(res);res=0;flag=0;break;
            case '*':res=si.top();si.pop();res=si.top()*res;si.pop();si.push(res);res=0;flag=0;break;
            case '/':res=si.top();si.pop();res=si.top()/res;si.pop();si.push(res);res=0;flag=0;break;
            default: break;
        }

    }

}

 return si.top();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
中缀表达式后缀表达式是一种常见的算法,它可以将中缀表达式转换为后缀表达式,使得计算更加方便。后缀表达式也叫做逆波兰表达式,它的计算方式是从左到右扫描表达式,遇到数字就压入中,遇到运算符就从中弹出两个数字进行计算,并将计算结果压入中,最终中只剩下一个数字,即为表达式计算结果。 下面是一个C++的后缀表达式计算类的定义,其中包括了后缀表达式计算方法和一些辅助方法: ``` #include <stack> #include <string> #include <sstream> class PostfixCalculator { public: PostfixCalculator() {} double calculate(std::string postfix) { std::stack<double> s; std::stringstream ss(postfix); std::string token; while (std::getline(ss, token, ' ')) { if (isOperator(token)) { double operand2 = s.top(); s.pop(); double operand1 = s.top(); s.pop(); double result = applyOperator(token, operand1, operand2); s.push(result); } else { double operand = std::stod(token); s.push(operand); } } return s.top(); } private: bool isOperator(std::string token) { return token == "+" || token == "-" || token == "*" || token == "/"; } double applyOperator(std::string op, double operand1, double operand2) { if (op == "+") { return operand1 + operand2; } else if (op == "-") { return operand1 - operand2; } else if (op == "*") { return operand1 * operand2; } else if (op == "/") { return operand1 / operand2; } return 0; } }; ``` 使用该类可以方便地计算后缀表达式的值,例如: ``` PostfixCalculator calculator; double result = calculator.calculate("1 2 3 - 4 * + 10 5 / +"); ``` 其中,后缀表达式为"1 2 3 - 4 * + 10 5 / +",计算结果为11.0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值