用栈实现表达式转换

2023-05-16

中缀转后缀:

从左到右依次扫描中缀表达式,遇到操作数就直接写出来(顺序是从前往后写),遇到运算符时,判断当前运算符与栈顶运算符的优先级,如果当前运算符的优先级小于或者等于栈顶元素运算符的优先级,就把栈顶运算符出栈,并将其写入当前结果表达式中(这个比较是个循坏,依次把当前元素和新的栈顶元素进行比较,如果还是小于等于则继续出栈,知道比较的是结果是大于栈顶运算符优先级则把当前运算符出栈)。
对于表达式中含有括号,当遇到左括号则直接入栈,当栈顶元素是左括号时则扫描的元素全入栈,当扫描的运算符是右括号时则执行一系列出栈操作,把当前栈中从栈顶到左括号的元素全部出栈,并将其写入结果表达式中,把括号丢弃。
最后当扫描完中缀表达式中所有字符时,此时若栈中还有剩余的运算符,则将其全部出栈并写入结果表达式中。
在这里插入图片描述

描述:首先把操作数a写入结果表达式,然后把运算符+压入栈中,然后把b写入结果表达式,然后运算符-的优先级等于栈顶元素+的优先级所以+出栈写入结果表达式,然后栈空所以把-运算符压入栈中,然后把a写入结果表达式,由于乘号运算符的优先级大于栈顶元素-的优先级,所以把乘号压入栈中,然后把两个左括号压入栈中,把c写入结果表达式,把运算符+压入栈中,把d写入结果表达式,遇到右括号,把与左括号之间的元素全部出栈并把括号丢弃掉。紧着着是运算符/,由于此时栈顶元素是左括号所以直接入栈,把e写入结果表达式,由于-运算符的优先级小于/所以/出栈,然后此时栈顶元素是左括号所以把-压入栈中,遇到右括号,把与左括号之间的元素依次出栈并把括号丢弃。由于运算符+的优先级小于乘号,所以乘号出栈,又等于-的优先级所以-出栈,此时栈空把+压入栈中,把操作数g写入结果表达式,此时已经扫描完表达式中所有字符,所以把栈中所剩的+出栈。
注意:本例中转换过程中在栈中的操作符的最大个数是5

中缀转前缀:

和转前转前缀式一个相反的过程,这个需要从右往左依次扫描。写结果表达式是从后往前写。
遇到右括号入栈遇到左括号把它们之间的元素全部出栈。还有一点,在转后缀时,如果此时运算符的优先级小于或者等于栈顶运算符优先级则出栈,而在转前缀时是小于。
后缀转前缀:每次扫描到一个运算符时,就把这个运算符所对应的两个子表达式移到运算符后面。(这个移动的过程我们借助栈来实现)

中缀转后缀:代码实现

  void infixToPostFix(char infix[],char s2[],int &top2)
//第一个参数是中缀表达式串,后面两个参数是一个栈,用来保存转换之后的结果
{  
   char s1[maxSize];int top1=-1;//辅助栈
   int i=0;
   while(infix[i] !=’\0)//循环扫描整个中缀表达式串
  {
      //如果是操作数则直接写出来
      if(0<=infix[i]&&infix[i]<=9)
     {
        s2[++top2]=infix[i];//直接入栈
          ++i;             //i后移一位
       }
//如果扫描的是左括号则直接入辅助栈
else if(infix[i]==' ( ')
{
   s1[++top1]=(;
   ++i;            
}
//然后处理运算符
else if (infix[i] ==+||infix[i]==-||infix[i]==*||infix==/)
//如果辅助栈为空或者栈顶元素是左括号或者此时元素的优先级大于栈顶元素的优先级则入辅助栈
  {
 if(top1==-1||
s1[top1]==(||
getPriority(infix[i])>getPriority(s1[top1]))
         {
            s1[++top1]==infix[i];
            ++i;
          }
     //否则就把s1栈顶元素出栈然后入s2栈
           else
              s2[++top2]=s1[top1--];//s1栈顶元素出栈然后入s2栈
          }
     //对右括号进行处理
         else if(infix[i]==)‘)
         {  
            while (s1[top1]!=()
                  s2[++top2]=s1[top1--];
             --top1;           //把左括号也出栈
             ++i;
            }
   }
//把辅助栈s1中剩余的元素全部出栈并入s2栈
    while(top1!=-1)
      s2[++top2]=s1[top1--];
}

中缀转前缀:代码实现

(这个和上面一样,只不过扫描顺序需要改变为从右到左,然后左右括号对调一下,注意一下运算优先级哪里的判断,入栈的操作变成大于等于)

void infixToPreFix(char infix[],int len,char s2[],int &top2)
//因为需要从后往前扫描所以需要知道表达式的长度
   {
       char s1[maxSize];int top = -1;
int i=len -1;
while(i>=0)
{
   if(0<=infix[i]&&infix[i]<=9)
   {
      s2[++top2]=infix[i];
      --i;
     }
    else if(infix[i]=))
    {
      s1[++top1]=intfix[i];
      i--;
     }
    else if(infix[i]=='+'||infix[i]=='-'||
            infix[i]=='*'||infix[i]=='/')
    {  
       if(top1=-1||s1[top1]==)||
          getPriority(infix[i])>=getPriority(s1[top1]))
        {
           s1[++top]=infix[i];
            i--;
          }
         else
            s2[++top2]=s1[top1--];
       }
      else if(infix[i]==()
       {
           while(s1[top1]!=))
                s2[++top2]=s1[top1--];
                --top1;//把右括号也出栈
                --i;
         }
}
while(top1!=-1)
   s2[++top2]=s1[top1--];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用栈实现表达式转换 的相关文章

随机推荐

  • Centos7.8 安装 openldap+phpldapadmin 最详细步骤

    本文借助很多网上知识 做一个汇总 xff0c 并且自己手动一步步安装 很多openldap安装都是0几年的安装方式 xff0c 下面给大家演示我一步步安装的详细过程 xff0c CentOS7系统安装就不做演示了 xff0c 直接开肝 这里
  • Apache配置中文说明

    APACHE的配置 xff08 中文 xff09 基于 NCSA 服务的配置文件 这是Apache服务器主要配置文件 它包含服务器的影响服务器运行的配置指令 参见以取得关于这些指令的详细信息 不要只是简单的阅读这些指令信息而不去理解它 这里
  • ubunut 18.04安装xrdp及pulseaudio-module-xrdp

    1 桌面环境 sudo apt install xfce4 2 xrdp服务 sudo apt install xrdp 参考 xff1a xrdp 3 远程声音重定向 确认pulseaudio版本为11 1 pulseaudio vers
  • ios8 新的AlertView

    转自cocoachina OS 8的新特性之一就是让接口更有适应性 更灵活 xff0c 因此许多视图控制器的实现方式发生了巨大的变化 全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备尺寸变化
  • Debian 系统时间配置(NTP)

    系统时间NTP和RTC同步 xff0c Debian的时区配置 系统及架构 xff1a Linux Matrix 061001 5 10 42 yocto standard 1 Thu Jun 3 07 00 52 UTC 2021 arm
  • ubuntu之VScode

    文章目录 0 安装1 配置中文2 插件 xff08 推荐使用 xff09 3 conda4 matlab5 fira字体设置6 字符显示配置7 terminal自定义颜色配置8 环境变量 xff1a terminal runner问题9 复
  • PPT中一打开输入法后就卡死

    解决办法 C Program Files Common Files xff08 x86 xff09 Microsoft Shared OFFICE12 Office Setup Controller xff0c 把这个文件夹删除即可
  • LaTex 使用plt.savefig保存矢量图并插入论文中

    问题描述 今天开始给实验结果画图了 xff0c 总觉得使用png格式的图片糊糊的 xff0c 于是决定研究一下如何将矢量图插入Latex中 解决方案 由于我需要插入的图片是使用python绘制的并通过plt savefig保存下来 通过参考
  • AD18中制作自己的原理图模板

    新建原理图 xff0c 在原理图上使用画线等工具做出自己想要的样式 xff0c xff08 如果要在模板中加入图片 xff0c 可以直接将想要的图片用鼠标直接拖到原理图中 xff09 xff0c 制作好后将原理图另存为后缀 SchDot x
  • STM32 RTC晶振不起振原因

    今天下载程序后发现程序像死机一样 xff0c 然后仿真发现 xff0c 程序一直在等待RTC晶振就绪 xff0c 最终超时死机 然后检查的电路看都没问题 xff0c 最后通过查阅资料和咨询厂家了解到可能是晶振匹配电容的原因 如下为记录 xf
  • NO Cortex-M Device found in JTAG chain常见问题及解决方法.

    昨晚调试程序时 xff0c 由于是在别人程序基础上修改的程序 xff0c 没有对照自己的硬件原理图 xff0c 导致程序下载过后就不能再继续下载 xff0c 但那个源程序 xff08 即楼主参考的程序 xff09 还是可以继续下载 xff0
  • STM32系统时钟硬件仿真查看

    前几天回校调试基于407的程序 xff0c 以前都是在别人的程序基础上面改写只要能实现想要的功能不会管其他的 xff0c 结果基本就没用用过硬件JLINK的硬件仿真 xff0c 那晚蔡师姐帮忙一直弄到夜里12点多 xff0c 真的很感谢她
  • keil里面不能修改程序或加入程序

    楼主后知后觉 xff0c 今天打开一个工程文件 xff0c 发现不能在其中的文件 xff08 含有 xff09 里添加注释和修改 几经周折后 xff0c 发现这个问题与Keil没有关系 xff0c 这个带有锁的文件属性是 xff1a 只读
  • Alutium Designer中原理图库设计时如何设置鼠标移动元器件的最小间隔

    1 点击图中菜单栏中的高亮部分 43 43 43 43 43 2 点进去后 xff0c 选择 Set snap Grid xff0c 最小设置为1mil 完成
  • app定位、地图、坐标系的那些坑

    原文地址 xff1a http www jianshu com p f8224779ca63 开发App时会遇到各种坑 xff0c 本文分享我们在iOS Android系统中定位和地图中遇到的坑 xff0c 以及携程App的解决方案 定位
  • VMware Workstation 12安装windows server 2003

    VMware Workstation 12安装windows server 2003 无法显示图形界面报N多错问题 问题描述 xff1a 在VMware Workstation 12 xff08 下文简称VM 12 xff09 安装wind
  • 一步错,步步错,python或pip'不是内部或外部命令”你的 Path环境变量格式对了吗?实测有效!

    如果你遇到 python或 pip 不是内部或外部命令 可能是你的 Path环境变量格式输入有误 xff01 一步错 xff0c 步步错 xff01 很多人可能在安装配置 Python环境时被 python 不是内部或外部命令 也不是可运行
  • 【Cousera】北京大学 | 计算导论与C语言基础习题_05:第二个重复出现的数

    05 第二个重复出现的数 总时间限制 1000ms 内存限制 65536kB 描述 给定一个正整数数组 xff08 元素的值都大于零 xff09 xff0c 输出数组中第二个重复出现的正整数 xff0c 如果没有 xff0c 则输出字符串
  • E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它? 解决方案

    问题描述 操作系统 xff1a Ubuntu18 04 今天在执行以下指令时 xff1a sudo apt upgrade 出现了以下错误 xff1a E 无法获得锁 var lib dpkg lock frontend open 11 资
  • 用栈实现表达式转换

    中缀转后缀 xff1a 从左到右依次扫描中缀表达式 xff0c 遇到操作数就直接写出来 xff08 顺序是从前往后写 xff09 xff0c 遇到运算符时 xff0c 判断当前运算符与栈顶运算符的优先级 xff0c 如果当前运算符的优先级小