数据结构与算法——7-20 表达式转换 (25分)

7-20 表达式转换 (25分)

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。

输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

思路:转化为后缀表达式就是出栈入栈的操作,分为是操作符还是操作符部分,并注意判断正负,小数点以及左右括号和算术优先级问题

#include 
#include
#include
#include
using namespace std;
void to_convert(string str){
    stack<char> stk;
    //定义优先级
    map<char,int> m;
    m['+'] = m['-'] = 1;m['*'] = m['/'] = 2;m['('] = m[')'] = 3;//列出优先级
    int index = 0;
    bool flag = true;//判断是否是第一输出
    while(index < str.size()){
        //判断是否是操作数,如上图介绍
        if((index < 1 || str[index - 1] == '(') && (str[index] == '+' || str[index] == '-')  || isdigit(str[index]))
        {
            if(flag) flag = false;
            else cout<<" ";//不是第一个就打印空格
            
            if(str[index] != '+') cout<< str[index];//判断如果是负数的情况,打印负号
            while(str[index + 1] == '.' || isdigit(str[index + 1]))//判断有小数点的情况
                cout<<str[++index];
            index++;
        }
        else{
            //操作符的情况,比较优先级,弹出优先级大于等于自己的。
            if(str[index] == '(') stk.push(str[index]);
            else if(str[index] == ')')
            {
                while(!stk.empty() && stk.top() != '(')
                {
                    printf(" %c", stk.top());//弹出栈顶元素直到左括号出现或者栈空
                    stk.pop();
                }
                stk.pop();//左括号出栈
            }
            else{
                while(!stk.empty() && stk.top() != '(' && m[stk.top()] >= m[str[index]]){//不是括号而是其他字符 则按照优先级输出
                    printf(" %c", stk.top());
                    stk.pop();
                }
                stk.push(str[index]);
            }
            index++;
        }
    }
    while(!stk.empty()){
        printf(" %c", stk.top());
        stk.pop();
    }
}
int main(int argc, char const *argv[])
{
    string s;
    cin>>s;
    to_convert(s);
    return 0;
}

你可能感兴趣的:(数据结构与算法,数据结构,算法,栈,c++,字符串)