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
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明
中缀表达式后缀表达式是一种常见的算法,它可以将中缀表达式转换为后缀表达式,使得计算更加方便。后缀表达式也叫做逆波兰表达式,它的计算方式是从左到右扫描表达式,遇到数字就压入中,遇到运算符就从中弹出两个数字进行计算,并将计算结果压入中,最终中只剩下一个数字,即为表达式计算结果。 下面是一个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、付费专栏及课程。

余额充值