介绍
本篇文章为大家展示了c++中怎么将中缀表达式转换为后缀表达式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
<强>一、思路:和中缀表达式的计算类似,只不过不用计算,把表达式输出即可强>
1。用字符数组存储整行输入的中缀表达式;
2。接着从字符数组的0位置开始判断字符,如果是数字,那就要判断后面是否是数字,如果是就不断扫描组成一个整数
(暂不考虑负数和小数),最终组成一个整数,然后输出这个数(因为不用计算,所以直接输出即可);
3。如果是左括号,直接进符号栈;
4。如果是操作运算符,与符号栈的栈顶元素比较优先级:如果高就压入栈;
低,就取出符号栈顶的元素输出;
接着,再判断符号栈顶的元素和当前的运算符号继续比较优先级,重复前面步骤,直到栈空或者当前的符号优先级高;
5。如果是右括号,把符号栈栈顶的元素取出,如果不是左括号,把取出的运算符输出,接着取符号栈栈顶的元素,直到符号栈中取出的符号是左括号;
6。当扫描完字符数组时,判断符号栈是否为空:
不为空,把符号栈栈顶的元素取出,输出到窗口,直到符号栈为空。
<强>二,实现程序:强>
<>之前,//,中缀表达式转后缀表达式//,操作符:+、-、*、/?//,输入:可以用cin.getline(加勒比海盗,250)或者cin.get (ch),,,, ch !=, & # 39; \ n # 39;//,测试数据:输入格式:(注意:不能有中文的操作符)//,,,,,,2 + (3 + 4)* 5//,,,,,,16 + 2 * 30/4//,,,输出格式://,,,,,2,3,4,+,5 *,+//,,,,,16,2,30,*,4/,+ ,, # include # include ,,//,判断是否是操作符 bool isOperator (char ch), { 如果才能(ch ==, & # 39; + & # 39;, | |, ch ==, & # 39; & # 39;, | |, ch ==, & # 39; * & # 39;, | |, ch ==, & # 39;/& # 39;) ,,,return 真实; return 才能,假的,,//,否则返回错误的 } ,,//,获取优先级 int getPriority (char ch), { int 才能;level =, 0;,//,优先级 ,, 开关才能(ch), { ,,,case & # 39; (& # 39;: ,,,,,level =, 1; ,,,,,休息; ,,,case & # 39; + & # 39; ,,,case & # 39; & # 39;: ,,,,,level =, 2; ,,,,,休息; ,,,case & # 39; * & # 39;: ,,,case & # 39;/& # 39;: ,,,,,level =, 3; ,,,,,休息; ,,,默认值: ,,,,,休息; ,,} return 才能;水平; } ,, 命令行参数个数,int 主要(int const char *, argv []), {//才能,insert code 这里… int 才能,num; char 才能arr[250];,//,一个一个的读取表达式,直到遇到& # 39;\ 0 & # 39; std::才能stack op,,//,栈op:存储操作符 ,, 而(1)才能,{ ,,,std:: cin.getline(加勒比海盗,250); ,,,int len,,我; ,,,char c, c,//,存储从栈中取出的操作符 ,,,, ,,,len =, (int) strlen (arr);,//, strlen()输出的是:unsigned 长类型,所以要强制转换为int类型 ,,,小姐:=,0; ,,,,(小姐:& lt;, len), { ,,,,,如果(isdigit (arr[我])),{,//如果是数字 ,,,,,,,num =, 0; ,,,,,,,do { ,,,,,,,,,num =, num *, 10, +, (arr[我],安康;& # 39;0 & # 39;);,//,ch 作用;48根据ASCAII码,字符与数字之间的转换关系 ,,,,,,,,,我+ +,//,下一个字符 ,,,,,,,},(isdigit (arr[我])); ,,,,,,,std:: cout & lt; & lt;, num & lt; & lt;,,,,, ,,,,,},else 如果(arr[我],==,& # 39;(& # 39;),{,//(:左括号 ,,,,,,,op.push (arr[我]); ,,,,,,,我+ +; ,,,,,},else 如果(isOperator (arr[我])),{,//操作符 ,,,,,,,如果(op.empty()),{//,如果栈空,直接压入栈 ,,,,,,,,,op.push (arr[我]); ,,,,,,,,,我+ +; ,,,,,,,} ,,,,,,,else { ,,,,,,,,,//,比较栈op顶的操作符与ch的优先级 ,,,,,,,,,//,如果ch的优先级高,则直接压入栈 ,,,,,,,,,//,否则,推出栈中的操作符,直到操作符小于ch的优先级,或者遇到(,或者栈已空 ,,,,,,,,,,(! op.empty ()), { ,,,,,,,,,,,c =, op.top (); ,,,,,,,,,,,如果(getPriority (arr[我]),& lt;=, getPriority (c)), { null null null null null null null null null null null null null null null null null null null null null null null null null null null null