7-1 表达式转换 (100分)(STL做法 简洁 带有全面的代码分析)

    科技2026-06-18  20

    7-1 表达式转换 (100分)

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

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

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

    输入样例: 2+3*(7-4)+8/4 输出样例: 2 3 7 4 - * + 8 4 / +

    #include<bits/stdc++.h> using namespace std; stack<char>st;//用C++中自带的stack类方便很多 map<char,int> Rank;//这里简单用map容器来存储一下对加减乘除优先级的比较 int main(){ Rank['+']=Rank['-']=1; Rank['*']=Rank['/']=2;//用于下面比较优先级时直接用1和2进行比较 string str;//输入的一串数字 cin>>str; bool isfirst=true;//用于控制下面的输出前面的空格格式 for(int i=0;str[i];i++){ //先判断和处理数字和特殊情况 //判断str[i]为整数,为小数点以及正负号与数字一起输出有关的特殊情况 if( ( isdigit(str[i]) ) || (str[i]=='.') || ( (i==0||str[i-1]=='(') && (str[i]=='+'||str[i]=='-') )){ //判断是数字前面的正号这里的判定条件比较特别 //除了是输入语句的第一个字符或者是前括号之后的第一个字符为+才判定为正号而不是加号 //因为数字前面的正号不需要输出 if(!isfirst)//如果不是首字符则输出空格用来控制格式与题目要求对应 cout<<" "; if(str[i]!='+')//如果是负号直接输出,正数则不用 cout<<str[i]; while(str[i+1]=='.'||isdigit(str[i+1]))//如果是小数就继续往后读 { cout<<str[++i]; }isfirst=false; }else//为运算符时 { if(str[i]=='(')//如果是左括号,压入栈中 { st.push(str[i]); }else if(str[i]==')') //如果是右括号,则依次将栈中的运算符弹出并输出,直到遇到左括号,并丢弃这对括号 { while(!st.empty()&&st.top()!='(')//栈不为空且栈顶元素不为( { cout<<" "<<st.top();//输出 st.pop(); }st.pop();//将左括号弹出栈不输出 }else if(st.empty()||Rank[str[i]]>Rank[st.top()]){ //当为空栈或者读入运算符优先级比栈顶元素高时,入栈 st.push(str[i]); }else{ //当读入运算符优先级比栈顶元素小或者相等时 while(!st.empty()&&st.top()!='(') { cout<<" "<<st.top();//输出栈顶元素并出栈 st.pop(); }st.push(str[i]);//将运算符入栈 } } }//最后把堆栈中存留的运算符全部输出 while(!st.empty()){ cout<<" "<<st.top(); st.pop(); }return 0; }
    Processed: 0.008, SQL: 9