中缀表达式转后缀表达式


中缀表达式转后缀表达式


中缀表达式a + b*c + (d * e + f) * g,其转换成后缀表达式则为a b c * + d e * f  + g * +。
转换过程需要用到栈,具体过程如下:
1)如果遇到操作数,我们就直接将其输出。
2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。
3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。
4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下我们才弹出" ( ",其他情况我们都不会弹出" ( "。当然按照优先级数组来说也是很正常的。
5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
#include
#include
#include
using namespace std;
bool Decide(char c);
char Precede(char a,char b);
char SwitchPrecede(stack &tempS,char &c);
int main()
{
    cout<<"the end of your input should be '#'"<<endl;
    stack tempS;//临时存放操作符
    char c;
    int temp = 0;
    c = getchar();
    tempS.push('#');
    while(true)
    {
         if(temp!=0)
        {
            cout<<temp;
            temp=0;
        }
        if(Decide(c))
        {
            if(c==')')
            {
                while(tempS.top()!='(')
                {
                    cout<<tempS.top();
                    tempS.pop();
                }
                tempS.pop();//去除左括号
                c=getchar();
                continue;

            }
            if(tempS.top()=='#')
            {
                tempS.push(c);
            }
            else if(c!='#')
            {
                SwitchPrecede(tempS,c);
            }
        }
        else if(c>='0'&&c<='9')
        {
            temp = temp*10+c-'0';
        }
        if(c=='#')
        {
            while(tempS.top()!='#')
            {
                cout<<tempS.top();
                tempS.pop();
            }
            break;
        }
        c = getchar();
    }

    return 0;
}
bool Decide(char c)
{
 if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
    return true;
 else
    return false;
}
char Precede(char a,char b)
{
    int j[2];
    char table[7][7]=
    {
        {'>','>','<','<','<','>','>'},
        {'>','>','<','<','<','>','>'},
        {'>','>','>','>','<','>','>'},
        {'>','>','>','>','<','>','>'},
        {'<','<','<','<','<','=','e'},
        {'>','>','>','>','e','>','>'},
        {'<','<','<','<','<','e','='}
    };
    for(int i=0;i<2;i++)
    {
        char c;
        if(i==0)
        {
            c=a;
        }
        else if(i==1)
        {
            c=b;
        }
        switch(c)
        {
          case '+':j[i]=0;break;
          case '-':j[i]=1;break;
          case '*':j[i]=2;break;
          case '/':j[i]=3;break;
          case '(':j[i]=4;break;
          case ')':j[i]=5;break;
          case '#':j[i]=6;break;
        }
    }
    return table[j[0]][j[1]];
}
char SwitchPrecede(stack &tempS,char &c)
{
    switch(Precede(tempS.top(),c))
    {
        case '>':
        case '=':
            cout<<tempS.top();
            tempS.pop();
            SwitchPrecede(tempS,c);//递归
            break;
        case '<':
            tempS.push(c);
            break;
    }
}


多源动态最优潮流的分布鲁棒优化方法(IEEE118节点)(Matlab代码实现)内容概要:本文介绍了基于Matlab代码实现的多源动态最优潮流的分布鲁棒优化方法,适用于IEEE118节点电力系统。该方法结合两阶段鲁棒模型与确定性模型,旨在应对电力系统中多源输入(如可再生能源)的不确定性,提升系统运行的安全性与经济性。文中详细阐述了分布鲁棒优化的建模思路,包括不确定性集合的构建、目标函数的设计以及约束条件的处理,并通过Matlab编程实现算法求解,提供了完整的仿真流程与结果分析。此外,文档还列举了大量相关电力系统优化研究案例,涵盖微电网调度、电动汽车集群并网、需求响应、储能配置等多个方向,展示了其在实际工程中的广泛应用价值。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事能源系统优化工作的工程师。; 使用场景及目标:①用于研究高比例可再生能源接入背景下电力系统的动态最优潮流问题;②支撑科研工作中对分布鲁棒优化模型的复现与改进;③为电力系统调度、规划及运行决策提供理论支持与仿真工具。; 阅读建议:建议读者结合提供的Matlab代码与IEEE118节点系统参数进行实操演练,深入理解分布鲁棒优化的建模逻辑与求解过程,同时可参考文中提及的其他优化案例拓展研究思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值