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 & lt; iostream>
  # include & lt; stack>//判断是否是操作符
  bool isOperator (char ch) {
  如果(ch==& # 39; + & # 39;| | ch==& # 39; & # 39;| | ch==& # 39; * & # 39;| | ch==& # 39;/& # 39;
  返回true;
  返回错误;//否则返回错误的
  }//获取优先级
  int getPriority (char ch) {
  int水平=0;//优先级
  
  开关(ch) {
  & # 39;(& # 39;:
  水平=1;
  打破;
  & # 39;+ & # 39;
  & # 39;& # 39;:
  水平=2;
  打破;
  & # 39;* & # 39;:
  & # 39;/& # 39;:
  水平=3;
  打破;
  默认值:
  打破;
  }
  回报水平;
  }
  
  int主要(int命令行参数个数,const char * argv []) {//插入代码…
  int num;
  arr char [250];//一个一个的读取表达式,直到遇到& # 39;\ 0 & # 39;
  std:: stack人事处;//栈op:存储操作符
  
  而(1){
  std:: cin.getline(加勒比海盗,250);
  int len,我;
  字符c;//c存储从栈中取出的操作符
  
  len=(int) strlen (arr);//strlen()输出的是:无符号长类型,所以要强制转换为int类型
  我=0;
  虽然(我& lt;len) {
  如果(isdigit (arr[我])){//如果是数字
  num=0;
  {做
  num=num * 10 + (arr[我]- & # 39;0 & # 39;);//ch - 48根据ASCAII码,字符与数字之间的转换关系
  我+ +;//下一个字符
  },(isdigit (arr[我]));
  std:: cout & lt; & lt;num & lt; & lt;“;“;
  }else if (arr[我]==& # 39;(& # 39;){//(:左括号
  op.push (arr[我]);
  我+ +;
  [我]}else if (isOperator (arr)){//操作符
  如果(op.empty()){//如果栈空,直接压入栈
  op.push (arr[我]);
  我+ +;
  }
  其他{//比较栈op顶的操作符与ch的优先级//如果ch的优先级高,则直接压入栈//否,则推出栈中的操作符,直到操作符小于ch的优先级,或者遇到(,或者栈已空
  而(! op.empty ()) {
  c=op.top ();
  如果(getPriority (arr[我])& lt;=getPriority (c)) {//优先级低或等于
  std:: cout & lt; & lt;c & lt; & lt;“;“;
  op.pop ();
  }//其他ch优先级高于栈中操作符
  打破;
  }//而结束
  op.push (arr[我]);//防止不断的推出操作符,最后空栈了,或者ch优先级高了
  我+ +;
  }//其他
  }else if (arr[我]==& # 39;)& # 39;){//如果是右括号,一直推出栈中操作符,直到遇到左括号(
  而(op.top () !=& # 39; (& # 39;) {
  std:: cout & lt; & lt;op.top () & lt; & lt;“;“;
  op.pop ();
  }
  op.pop ();//把左括号(推出栈
  我+ +;
  }//其他如果是空白符,就进行下一个字符的处理
  我+ +;
  }//第二个同时结束
  而(! op.empty()){//当栈不空,继续输出操作符
  std:: cout & lt; & lt;op.top () & lt; & lt;“;“;
  op.pop ();
  }
  std:: cout & lt; & lt;std:: endl;
  冲洗(std:: cout);
  }//第一个而结束
  返回0;
  }

运行结果:

 C + +实现中缀表达式转后缀表达式的方法

c++实现中缀表达式转后缀表达式的方法