C++ 中缀表达式转后缀表达式

C++ 中缀表达式转后缀表达式一 思路 和中缀表达式的计算类似 只不过不用计算 把表达式输出即可 nbsp nbsp nbsp nbsp nbsp 1 用字符数组存储整行输入的中缀表达式 nbsp nbsp nbsp nbsp nbsp 2 接着从字符数组的 0 位置开始判断字符 如果是数字 那就要判断后面是否是数字 如果是就不断扫描组成一个整数 nbsp nbsp nbsp nbsp nbsp nbsp nbsp 暂不考虑负数和小数 最终组成一个整数 然后输出这个数 因为不用计算 所以直接输出即可 nbsp nbsp nbsp nbsp nbsp 3 如果是左括号 直接进符号

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

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

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

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

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

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

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

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

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

         中取出的符号是左括号;

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

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

 

二、实现程序:

// 中缀表达式转后缀表达式 // 操作符:+、-、*、/、% // 输入:可以用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++ 中缀表达式转后缀表达式

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222147.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:28
下一篇 2026年3月17日 下午4:28


相关推荐

  • flask框架总结(一)

    flask框架总结(一)正如总所周知的一样 Flask 是一个使用 Python 编写的轻量级 Web 应用框架 轻巧页就意味着他比较简洁 不过见到的 MTV 框架还是有的 MVC 但是最重要的还是他的可扩展性很强 对比与 Django 框架呢 他的灵活度就很高了 可以自己一些设计代码框架 他比较适合一些 分层比较少 逻辑不怎么复杂的 web 项目 如果开发成本低的话 那就更适合了 现在就总结下他的一些功能 现在搭建个 fl

    2026年3月26日
    2
  • js中bind的用法_bind into

    js中bind的用法_bind intoJS中的bind的实现以及使用

    2022年4月21日
    80
  • Mysql中explain用法和结果字段的含义介绍

    使用 explain 查询和分析SQl的执行记录,可以进行sql的性能优化!explain用法mysql&gt; explain select * from students;+—-+————-+———-+——+—————+——+———+——+——+——-+| id …

    2022年2月27日
    39
  • sip服务器网页进不去,sip服务器地址异常

    sip服务器网页进不去,sip服务器地址异常sip 服务器地址异常内容精选换一换 GB28181 类型设备在接入 VIS 时 需要配置 VIS 对外提供的 SIP 服务器地址 端口 SIP 服务器地址和端口可以在 VIS 控制台获取 如图 1 所示 您可以通过本节内容解决如下问题 用户在管理控制台执行弹性云服务器相关操作后出现异常 针对管理控制台提示的异常信息 应该如何处理 用户参见 弹性云服务器接口参考 调用云服务器相关的 API 接口时 如果返回错误码 应该如何处理

    2026年3月17日
    2
  • sourceinsight注册码安装汉化教程_sourceinsight4.0中文乱码

    sourceinsight注册码安装汉化教程_sourceinsight4.0中文乱码注册码:SI3US-230590-09757SI3US-840598-11493SI3US-404808-04697SI3US-510811-93484SI3US-343066-11287

    2022年10月3日
    4
  • open class and closed class_demo怎么发音

    open class and closed class_demo怎么发音importos#给一个列表,生成文件夹,并在其中新建txt文件,写入文件名内容#例如彭于晏文件夹下有彭于晏.txt里面有彭于晏三个字name_list=[“彭于晏”,”周润发”,”周杰伦”,”陈道明”,”成龙”,”李连杰”,”阿里”,”百度”,”字节跳动”]#批量新建文件夹的关键formkdir()fornameinname_list:os.mkdir(name)#makedirs()通用file_name=name+”.txt”

    2025年8月19日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号