c++中怎么将中缀表达式转换为后缀表达式

  介绍

本篇文章为大家展示了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

c++中怎么将中缀表达式转换为后缀表达式