网站开发 项目章程,视频软件下载大全免费,网站工作沟通及建设,创作平台有哪些一#xff1a;题目
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法#xff0c;即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式: 输入在一行中给出不含空格的中缀表达式#xff0c;可…一题目
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式: 输入在一行中给出不含空格的中缀表达式可包含、-、*、\以及左右括号()表达式不超过20个字符。
输出格式: 在一行中输出转换后的后缀表达式要求不同对象运算数、运算符号之间以空格分隔但结尾不得有多余空格。
输入样例: 23*(7-4)8/4 输出样例: 2 3 7 4 - * 8 4 /
二思路和坑
首先这道题要用到 栈吧 然后 就是一个设置运算符的优先级 用到了map ,再者 就是 这个题的例子 贼狗 要考虑 正负号的问题正号省略不写 但负号 就一定要考虑进去 其他 一些的优先级 我在次罗列出来
中缀表达式转后缀表达式的方法 1.遇到操作数直接输出添加到后缀表达式中 2.栈为空时遇到运算符直接入栈 3.遇到左括号将其入栈 4.遇到右括号执行出栈操作并将出栈的元素输出直到弹出栈的是左括号左括号不输出。 5.遇到其他运算符加减乘除弹出所有优先级大于或者等于该运算符的栈顶元素然后将该运算符入栈 6.最终将栈中的元素依次出栈输出。 注意如果是在括号 中 遇到 符号优先级的问题时 输出停止条件 中 有 栈顶 不等于 ’‘
三上码上马 让我们骑马游荡天涯
/*
中缀表达式转后缀表达式的方法
1.遇到操作数直接输出添加到后缀表达式中
2.栈为空时遇到运算符直接入栈
3.遇到左括号将其入栈
4.遇到右括号执行出栈操作并将出栈的元素输出直到弹出栈的是左括号左括号不输出。
5.遇到其他运算符加减乘除弹出所有优先级大于或者等于该运算符的栈顶元素然后将该运算符入栈
6.最终将栈中的元素依次出栈输出。
*/#includebits/stdc.h
using namespace std;int main(){stackchars;mapchar,intm;//设置符号间的优先级m[] 1; m[-] 1;m[*] 2; m[/] 2;m[(] 3; m[)] 3;int flag 0;string str;cin str;for( int i 0; i str.size(); i ){//判断代码当中是否有数字 或则小数点 或则是 这个数带符号负号 if( ( ((i 0) || str[i - 1] () (str[i] || str[i] -))// 如果是负数则 eg-10) 其中 i 0 考虑到 第一个数 如果是 eg 10 || ( str[i] 0 str[i] 9) || ( str[i] . )){if(flag ! 0 ){cout ; } if( str[i] ! ){cout str[i];//此处是如果输出的是负号 则输出 如果是正号则不输出 }//这是要输出的数字eg 5.5 while( (str[i1] .) || (str[i 1] 0 str[i 1] 9)){ i;cout str[i];} flag 1;} else{if(str[i] )){while(!s.empty() s.top() ! (){cout s.top();s.pop(); }s.pop();//将栈中的( 删除 }else if(s.empty() || m[str[i]] m[s.top()]){s.push(str[i]); }else{//将优先级小于str[i] 输出去 但没遇到) 所以 ( 不用输出 while( !s.empty() s.top() ! (){cout s.top();s.pop(); } s.push(str[i]);} } }//将栈中剩余的符号输出来while(!s.empty()){cout s.top();s.pop(); } } 四学习总结
做题都一样遇到要考的算法不懂的就学比如这个题当中这个转换法则就是学的但是这个题自己做了两遍每一遍花费4个多小时都没做出来 自己考虑的点 不周 还有 算法 不精湛最后第三遍 参考了网上大佬的解法 但我都吃透大佬的代码 自己又敲了一遍菜鸟变大佬 我还有很长的路要走 如果你也是 那好 我们一块加油