文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-05 13:23

关注

本篇文章为大家展示了C++中怎么将中缀表达式转换为后缀表达式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一、思路:和中缀表达式的计算类似,只不过不用计算,把表达式输出即可

用字符数组存储整行输入的中缀表达式;

接着从字符数组的0位置开始判断字符,如果是数字,那就要判断后面是否是数字,如果是就不断扫描组成一个整数

(暂不考虑负数和小数),最终组成一个整数,然后输出这个数(因为不用计算,所以直接输出即可);

如果是左括号,直接进符号栈;

如果是操作运算符,与符号栈的栈顶元素比较优先级:如果高就压入栈;

低,就取出符号栈顶的元素输出;

接着,再判断符号栈顶的元素和当前的运算符号继续比较优先级,重复前面步骤,直到栈空或者当前的符号优先级高;

如果是右括号,把符号栈栈顶的元素取出,如果不是左括号,把取出的运算符输出,接着取符号栈栈顶的元素,直到符号栈中取出的符号是左括号;

当扫描完字符数组时,判断符号栈是否为空:

不为空,把符号栈栈顶的元素取出,输出到窗口,直到符号栈为空。

二、实现程序:

 // 中缀表达式转后缀表达式// 操作符:+、-、*、/、%// 输入:可以用cin.getline(arr, 250)或者cin.get(ch) && ch != '\n'// 测试数据:输入格式:(注意:不能有中文的操作符)//      2+(3+4)*5//      16+2*30/4//   输出格式://     2 3 4 + 5 * +//     16 2 30 * 4 / +  #include #include   // 判断是否是操作符bool isOperator(char ch) {  if(ch == '+' || ch == '-' || ch == '*' || ch == '/')    return true;  return false; // 否则返回false}  // 获取优先级int getPriority(char ch) {  int level = 0; // 优先级     switch(ch) {    case '(':      level = 1;      break;    case '+':    case '-':      level = 2;      break;    case '*':    case '/':      level = 3;      break;    default:      break;  }  return level;}  int main(int argc, const char * argv[]) {  // insert code here...  int num;  char arr[250]; // 一个一个的读取表达式,直到遇到'\0'  std::stack op; // 栈op:存储操作符     while(1) {    std::cin.getline(arr,250);    int len, i;    char c; // c存储从栈中取出的操作符         len = (int)strlen(arr); // strlen()输出的是:unsigned long类型,所以要强制转换为int类型    i = 0;    while(i < len) {      if(isdigit(arr[i])) { // 如果是数字        num = 0;        do {          num = num * 10 + (arr[i] - '0'); // ch - 48根据ASCAII码,字符与数字之间的转换关系          i++; // 下一个字符        }while(isdigit(arr[i]));        std::cout << num << " ";      } else if(arr[i] == '(') { // (:左括号        op.push(arr[i]);        i++;      } else if(isOperator(arr[i])) { // 操作符        if(op.empty()) {// 如果栈空,直接压入栈          op.push(arr[i]);          i++;        }        else {          // 比较栈op顶的操作符与ch的优先级          // 如果ch的优先级高,则直接压入栈          // 否则,推出栈中的操作符,直到操作符小于ch的优先级,或者遇到(,或者栈已空          while(!op.empty()) {            c = op.top();            if(getPriority(arr[i]) <= getPriority(c)) {              // 优先级低或等于              std::cout << c << " ";              op.pop();            } else // ch优先级高于栈中操作符              break;          } // while结束          op.push(arr[i]); // 防止不断的推出操作符,最后空栈了;或者ch优先级高了          i++;        } // else      } else if(arr[i] == ')') { // 如果是右括号,一直推出栈中操作符,直到遇到左括号(        while(op.top() != '(') {          std::cout << op.top() << " ";          op.pop();        }        op.pop(); // 把左括号(推出栈        i++;      } else // 如果是空白符,就进行下一个字符的处理        i++;    } // 第二个while结束    while(!op.empty()) { // 当栈不空,继续输出操作符      std::cout << op.top() << " ";      op.pop();    }    std::cout << std::endl;    flush(std::cout);  } // 第一个while结束  return 0;}

运行结果:
C++中怎么将中缀表达式转换为后缀表达式

上述内容就是C++中怎么将中缀表达式转换为后缀表达式,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯