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

本篇文章重点为大家分享一下C++中缀表达式转后缀表达式具体实现方法,有需要的小伙伴可以参考一下。

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

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 if(isdigit(arr[i])) { // 如果是数字
       num = 0;
       do {
         num = num * 10 + (arr[i] - '0'); // ch - 48根据ASCAII码,字符与数字之间的转换关系
         i++; // 下一个字符
       }while(isdigit(arr[i]));
       std::cout " ";
     } 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]) " ";
             op.pop();
           } else // ch优先级高于栈中操作符
             break;
         } // while结束
         op.push(arr[i]); // 防止不断的推出操作符,最后空栈了;或者ch优先级高了
         i++;
       } // else
     } else if(arr[i] == ')') { // 如果是右括号,一直推出栈中操作符,直到遇到左括号(
       while(op.top() != '(') {
         std::cout " ";
         op.pop();
       }
       op.pop(); // 把左括号(推出栈
       i++;
     } else // 如果是空白符,就进行下一个字符的处理
       i++;
   } // 第二个while结束
   while(!op.empty()) { // 当栈不空,继续输出操作符
     std::cout " ";
     op.pop();
   }
   std::cout while结束
 return 0;
}

运行结果:

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/202163.html<

(0)
管理的头像管理
上一篇2025-04-06 02:32
下一篇 2025-04-06 02:34

相关推荐

  • 云服务器和云虚拟主机怎么选?云服务器和虚拟主机区别

    云服务器适合业务增长快、需弹性扩展的场景,而云虚拟主机适合预算有限、技术门槛低的小型静态网站或测试环境,二者核心区别在于资源独享性与运维复杂度,核心差异解析:从底层架构到使用体验很多人容易混淆这两者,觉得它们都是“买空间建站”,它们的底层逻辑完全不同,云服务器(ECS)就像是你租了一整栋别墅,水电网络独立,你想……

    2026-06-29
    0
  • 赣州智慧旅游招聘是真的吗?赣州旅游人才招聘信息

    中级岗位(3-5年经验)月薪范围通常在6000-10000元,这类岗位需要独立负责项目模块,如独立运营一个抖音账号,或维护一个景区小程序的功能迭代,具备成功案例的候选人议价能力较强,高级岗位(5年以上经验)月薪范围通常在10000-20000元,部分核心管理岗可达更高,这类人才需要具备战略规划能力,如制定整个景……

    2026-06-29
    0
  • 赣州智能物联网车位锁如何管理?智能车位锁管理系统多少钱

    赣州智能物联网车位锁管理的核心在于通过云端平台实现远程控锁、状态实时监控及自动计费,彻底解决传统车位“被占难管”与“找位难”的痛点,在赣州这样的城市,随着机动车保有量的持续增长,老旧小区、商业综合体以及私人固定车位的资源矛盾日益凸显,传统的机械地锁或简易遥控锁,不仅操作繁琐,更无法实现数据化管理,引入智能物联网……

    2026-06-29
    0
  • 赣州智能消防栓好用吗,智能消防栓多少钱一个

    赣州智能消防栓通过物联网技术实现实时监测与远程报警,能显著降低火灾响应时间并提升城市消防安全管理水平,是目前智慧城市建设中不可或缺的基础设施,赣州智能消防栓的核心价值与应用场景传统消防栓往往存在“看不见、摸不着、用不了”的痛点,在赣州这样地形复杂、老城区与新城区并存的区域,传统设施的管理难度极大,智能消防栓的出……

    2026-06-29
    0
  • 云服务器和物理机到底有啥区别?

    云服务器本质上是虚拟化资源池中的弹性实例,而传统物理服务器是独占的硬件实体,前者胜在弹性与运维便捷,后者强在物理隔离与性能稳定,具体选择取决于业务对成本、扩展性及安全合规的权衡,很多人初次接触服务器时,容易把“云服务器”和“传统物理服务器”混为一谈,觉得它们都是用来跑网站或存数据的盒子,这两者的底层逻辑完全不同……

    2026-06-29
    0

发表回复

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