3-7 表达式转换
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
C++ (g++)
思路:
输入完中缀表达式后从第一个字符开始遍历字符串,遇到数字直接输出,遇到运算符就进行处理。
先将运算符分级,±为1级,*/为2级,左括号右括号为0级。
栈空直接入栈。
栈不为空的情况下:
操作符优先级大于栈顶运算符优先级,入栈
小于等于的话,就将栈中的运算符出栈,知道该运算符大于栈顶运算符优先级or栈为空。
读到(时,(直接入栈。
读到)时,)前面的运算符依次出栈直到遇到第一个(停止。
代码样例:
#include<bits/stdc++.h>
using namespace std;
stack<char> st;
map<char,int> mp;
int main(){
mp['+'] = mp['-'] = 1; //定义运算符的优先级
mp['*'] = mp['/'] = 2;
string s;
cin >> s;
int flag = 0;
for(int i=0;i<s.length();++i){
if(isdigit(s[i]) || s[i]=='.' || ((!i||s[i-1]=='(')&&(s[i]=='+'||s[i]=='-')) ){ //处理操作数
if(flag) cout << " ";
else flag = 1;
if(s[i]!='+') cout << s[i];
while(s[i+1]=='.'||isdigit(s[i+1])) cout << s[++i]; //小数继续往后读
}else{ //处理运算符
if(s[i]=='(') st.push(s[i]); //(:压栈
else if(s[i]==')'){ //):将栈顶的运算符弹出并输出,直到遇到左括号(出栈,不输出)
while(!st.empty()&&st.top()!='('){
cout << " " << st.top();
st.pop();
}
st.pop();
}
else if(st.empty()||mp[s[i]]>mp[st.top()]) st.push(s[i]); //s[i]的优先级比栈顶元素的大
else{
while(!st.empty()&&st.top()!='('){ //s[i]的优先级比栈顶元素的小或等
cout << " " << st.top();
st.pop();
}
st.push(s[i]);
}
}
}
while(!st.empty()){
cout << " " << st.top();
st.pop();
}
return 0;
}
本文介绍了一种算法,用于将中缀表达式转换为后缀表达式,并提供了详细的实现步骤及C++代码示例。
3989

被折叠的 条评论
为什么被折叠?



