第6周项目5

阅读: 评论:0

第6周项目5

第6周项目5

问题及代码:

    /*       Copyright (c)2015,烟台大学计算机与控制工程学院       All rights reserved.       文件名称:第6周项目5 - 后缀表达式.cpp       作    者:孙翰文       完成日期:2015年10月12日       版 本 号:v1.0       问题描述:利用sqstack.h中栈的基本运算,实现将一个中缀表达式转换为对应的后缀表达式的算法。 例如,输入(56-20)/(4+2),输出后缀表达式::56#20#-4#2#+/要求在数字后加#  输入描述:若干数据。 程序输出:对应表达式的输出。 */  

顺序栈算法库


    #include <stdio.h>  #include <stdlib.h>  #include "sqstack.h"  #define MaxOp 7  struct  //设定运算符优先级  {  char ch;   //运算符  int pri;   //优先级  }  lpri[]= {{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},  rpri[]= {{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};  int leftpri(char op)    //求左运算符op的优先级  {  int i;  for (i=0; i<MaxOp; i++)  if (lpri[i].ch==op)  return lpri[i].pri;  }  int rightpri(char op)  //求右运算符op的优先级  {  int i;  for (i=0; i<MaxOp; i++)  if (rpri[i].ch==op)  return rpri[i].pri;  }  bool InOp(char ch)       //判断ch是否为运算符  {  if (ch=='(' || ch==')' || ch=='+' || ch=='-'  || ch=='*' || ch=='/')  return true;  else  return false;  }  int Precede(char op1,char op2)  //op1和op2运算符优先级的比较结果  {  if (leftpri(op1)==rightpri(op2))  return 0;  else if (leftpri(op1)<rightpri(op2))  return -1;  else  return 1;  }  void trans(char *exp,char postexp[])  //将算术表达式exp转换成后缀表达式postexp  {  SqStack *opstack;               //定义运算符栈  int i=0;                //i作为postexp的下标  ElemType ch;  InitStack(opstack);   //用初始化栈运算为栈分配空间,务必要做  Push(opstack, '=');  while (*exp!='')      //exp表达式未扫描完时循环  {  if (!InOp(*exp))        //为数字字符的情况  {  while (*exp>='0' && *exp<='9') //判定为数字  {  postexp[i++]=*exp;  exp++;  }  postexp[i++]='#';   //用#标识一个数值串结束  }  else    //为运算符的情况  {  GetTop(opstack, ch);   //取得栈顶的运算符  switch(Precede(ch ,*exp))  {  case -1:           //栈顶运算符的优先级低:进栈  Push(opstack, *exp);  exp++;     //继续扫描其他字符  break;  case 0:        //只有括号满足这种情况  Pop(opstack, ch);      //将(退栈  exp++;     //继续扫描其他字符  break;  case 1:             //退栈并输出到postexp中  postexp[i++]=ch;  Pop(opstack, ch);  break;  }  }  } //while (*exp!='')  Pop(opstack, ch);  while (ch!='=')  //此时exp扫描完毕,退栈到'='为止  {  postexp[i++]=ch;  Pop(opstack, ch);  }  postexp[i]='';    //给postexp表达式添加结束标识  DestroyStack(opstack);  }  int main()  {  char exp[]="(56-20)/(4+2)"; //可将exp改为键盘输入  char postexp[200];  trans(exp,postexp);  printf("中缀表达式:%sn",exp);  printf("后缀表达式:%sn",postexp);  return 0;  }  

运行结果:

本文发布于:2024-03-16 11:13:19,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/1717434959275946.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:项目
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23