作者:阳光下微醺的我 | 来源:互联网 | 2023-10-13 07:54
表达式转换算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后
表达式转换
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
知识点:将中缀表达式转化为后缀表达式:
两种情况:
(1)没有括号的中缀表达式转化为后缀表达式:
(2)带有括号的中缀表达式转化为后缀表达式:
分析:本题是带有括号的中缀表达式,需要利用第二种方式实现,模拟过程我会在代码上详解
这里说一下这道题的细节问题:
中缀表达式转换为后缀表达式:对于本题而言,细节过多,在完成表达式转换的基础上
1.需要控制空格,首尾不能出现空格
2.需要判断一位以上的数字之间不能有空格
3.需要判断小数的情况,注意之间不能有空格
4.需要判断镶嵌括号的情况,容易出现格式错误
例如:当一开始就输入多个空格会使首位出现空格
5.需要判断正负号
(1)对于正号,当出现在第一位时需直接特判(在第一位无需加括号)
未在第一位出现正号一定会在括号内,而且输出时正号要省略
(2)对于负号,当出现在第一位时需要直接特判(在第一位出现无需加括号)
未在第一位出现负号一定会在括号内,需要输出负号
(3)注意控制好空格,防止格式错误
下面是代码:
#include
#include
#include
#include
#include
using namespace std;
const int M=1010;
char str[M],st[M],c;
stack<char> q;
int main()
{int i,j,k&#61;0,l,m,n,f&#61;0,t&#61;0,ff&#61;0;cin.getline(str,110);l&#61;strlen(str);for(i&#61;0; i<l; i&#43;&#43;){if(str[i]>&#61;&#39;0&#39;&&str[i]<&#61;&#39;9&#39;){t&#61;1;if(ff&#61;&#61;0){printf("%c",str[i]);ff&#61;1;f&#61;0;continue;}if(f&#61;&#61;0)printf("%c",str[i]);else {printf(" %c",str[i]);f&#61;0;}}else if(str[i]&#61;&#61;&#39;.&#39;){printf("%c",str[i]);}else if(i&#61;&#61;0&&str[i]&#61;&#61;&#39;&#43;&#39;){printf("%c",str[i]);}else if(i&#61;&#61;0&&str[i]&#61;&#61;&#39;-&#39;){printf("%c",str[i]);}else if(str[i]&#61;&#61;&#39;(&#39;&&str[i&#43;1]&#61;&#61;&#39;-&#39;){if(t&#61;&#61;1)printf(" %c",str[i&#43;1]);elseprintf("%c",str[i&#43;1]);q.push(str[i]);f&#61;0;i&#43;&#43;;}else if(str[i]&#61;&#61;&#39;(&#39;&&str[i&#43;1]&#61;&#61;&#39;&#43;&#39;){q.push(str[i]);f&#61;1;i&#43;&#43;;}else if(str[i]&#61;&#61;&#39;(&#39;){q.push(str[i]);f&#61;1;}else if(str[i]&#61;&#61;&#39;)&#39;){while(q.top()!&#61;&#39;(&#39;){printf(" %c",q.top());f&#61;1;q.pop();}q.pop();}else{if(q.size()&#61;&#61;0||q.top()&#61;&#61;&#39;(&#39;){f&#61;1;q.push(str[i]);}else if((str[i]&#61;&#61;&#39;*&#39;||str[i]&#61;&#61;&#39;/&#39;)&&(q.top()&#61;&#61;&#39;&#43;&#39;||q.top()&#61;&#61;&#39;-&#39;)){f&#61;1;q.push(str[i]);}else{if(q.top()&#61;&#61;&#39;*&#39;||q.top()&#61;&#61;&#39;/&#39;){f&#61;1;printf(" %c",q.top());q.pop();if(q.size()&#61;&#61;0||q.top()&#61;&#61;&#39;(&#39;){f&#61;1;q.push(str[i]);}else if(str[i]&#61;&#61;&#39;*&#39;||str[i]&#61;&#61;&#39;/&#39;){f&#61;1;q.push(str[i]);}else if(str[i]&#61;&#61;&#39;&#43;&#39;||str[i]&#61;&#61;&#39;-&#39;){f&#61;1;printf(" %c",q.top());q.pop();q.push(str[i]);}}else if(q.top()&#61;&#61;&#39;&#43;&#39;||q.top()&#61;&#61;&#39;-&#39;){if(str[i]&#61;&#61;&#39;*&#39;||str[i]&#61;&#61;&#39;/&#39;){f&#61;1;q.push(str[i]);}else if(str[i]&#61;&#61;&#39;&#43;&#39;||str[i]&#61;&#61;&#39;-&#39;){f&#61;1;printf(" %c",q.top());q.pop();q.push(str[i]);}}}}}while(q.size()!&#61;0){printf(" %c",q.top());q.pop();}printf("\n");return 0;
}