zoukankan      html  css  js  c++  java
  • 第六次课程作业

    核心部分

    将中缀表达式转换成后缀表达式

    string InfixToPostfix(string infix)
    {
        char current = 0;
        string postfix;//后缀表达式
    
        stack<char> mark;//符号栈
    
        map<char,int> priority;//符号优先级
        priority['+'] = 0;
        priority['-'] = 0;
        priority['*'] = 1;
        priority['/'] = 1;
    
        for(int i = 0;i < infix.size(); ++i)
        {
            current = infix[i];
            switch(current)
            {
                case '0':case '1':case '2':case '3':case '4':case '5':
                case '6':case '7':case '8':case '9':case '.':
                    postfix.push_back(current);//数字直接写入
                    break;
                case '+':case '-':case '*':case '/':
                    //如果运算符的前一项不是右括号即说明前一个数字输入完毕,用#标识
                    if(infix[i-1] != ')')
                        postfix.push_back('#');
                    //如果符号栈非空,即比较目前符号与栈顶符号优先级,低于等于出栈(并写入输出字符串),
                    //直至符号全部出栈或者遇到了'('或者大于栈顶符号的优先级
                    if(!mark.empty())
                    {
                        char tempTop = mark.top();
                        while(tempTop != '(' && priority[current] <= priority[tempTop])
                        {
                            postfix.push_back(tempTop);
                            mark.pop();
                            if(mark.empty())
                                break;
                            tempTop = mark.top();
                        }
                    }
                    mark.push(current);//新符号入栈
                    break;
                case '(':
                    if(infix[i-1] >= '0' && infix[i-1] <= '9')// for expression 2-5*2(6/2)
                    {
                        postfix.push_back('#');
                        mark.push('*');
                    }
                    mark.push(current);
                    break;
                case ')':
                    postfix.push_back('#');//右括号说明前方数字输入完成,标识一下
                    while(mark.top() != '(')
                    {
                        postfix.push_back(mark.top());
                        mark.pop();
                    }
                    mark.pop();//左括号出栈
                    break;
                default:
                    break;//忽略其他字符
            }
        }
        if(infix[infix.size()-1] != ')')
            postfix.push_back('#');//中缀表达式最后一个是数字需要加上#。
        while(!mark.empty())//如果栈非空,全部出栈并写入输出字符串
        {
            postfix.push_back(mark.top());
            mark.pop();
        }
        return postfix;
    }
    

    计算后缀表达式

    float posfixCompute(string s)
    {
        stack<float> tempResult;
    
        string strNum;
        float currNum = 0;
    
        float tempNum = 0;
        for(string::const_iterator i = s.begin(); i != s.end(); ++i)
        {
            switch(*i)
            {
                case '0':case '1':case '2':case '3':case '4':case '5':
                case '6':case '7':case '8':case '9':case '.':
                    strNum.push_back(*i);
                    break;
                case '+':
                    tempNum = tempResult.top();
                    tempResult.pop();
                    tempNum += tempResult.top();
                    tempResult.pop();
                    tempResult.push(tempNum);
                    break;
                case '-':
                    tempNum = tempResult.top();
                    tempResult.pop();
                    tempNum = tempResult.top() - tempNum;
                    tempResult.pop();
                    tempResult.push(tempNum);
                    break;
                case '*':
                    tempNum = tempResult.top();
                    tempResult.pop();
                    tempNum *= tempResult.top();
                    tempResult.pop();
                    tempResult.push(tempNum);
                    break;
                case '/':
                    tempNum = tempResult.top();
                    tempResult.pop();
                    tempNum = tempResult.top() / tempNum;
                    tempResult.pop();
                    tempResult.push(tempNum);
                    break;
                case '#':
                    currNum = atof(strNum.c_str());//in c++11, use currNum = std::stof(strNUm);
                    strNum.clear();
                    tempResult.push(currNum);
                    break;
            }
        }
        return tempResult.top();
    }
    
    
    // 表达式计算
    float expressionCalculate(string s)
    {
        return posfixCompute(InfixToPostfix(s));
    }
    

    C++界面编程

    通过网络上学习简单的了解了部分
    Hello World!的显示

    点击运行,不知道发生了什么,没有弹出窗口。
    将上面第 22 行代码改为:
    label->setText(tr("Hello World!"));

    可以将Hello World!更改为红色,微软雅黑字体。但是同样运行弹出窗口。
    不知道软件哪里出现了问题。。

    010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101
  • 相关阅读:
    hdu5628 Clarke and math
    LOJ#2452. 「POI2010」反对称 Antisymmetry
    LOJ#2444. 「NOI2011」阿狸的打字机
    BZOJ2795: [Poi2012]A Horrible Poem
    LOJ#2427. 「POI2010」珍珠项链 Beads
    云主机文件系统readonly处理案例
    兼容性测试中如何切换和管理多个JDK版本
    Promise之你看得懂的Promise
    一次MySQL线上慢查询分析及索引使用
    考拉消息中心消息盒子处理重构(策略模式)
  • 原文地址:https://www.cnblogs.com/Zzwena/p/6925889.html
Copyright © 2011-2022 走看看