| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 481 人关注过本帖
标题:关于中缀转后缀表达式的小问题、
取消只看楼主 加入收藏
逝灬丿
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-2-5
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
关于中缀转后缀表达式的小问题、
程序代码:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
main()
{
  int i=0,j=0; //i控制临时栈最高点,J控制输出栈
  int k=0; //临时栈的数量
  char *p;
  char str[100];//读入字符串
  int str2[100];//临时栈
  char str3[100];//输出栈
  scanf("%s",str);
  for(p=str;;p++)//指向原字符
  {
    if(*p>='0'&&*p<='9')
      str3[j++]=*p; //将那个数字放入输出栈
    else 
    {
      if(*p=='+') {str2[i++]=11;k++;}
      else if(*p=='-') {str2[i++]=12;k++;}
      else if(*p=='*') {str2[i++]=21;k++;}
      else if(*p=='/') {str2[i++]=22;k++;}//i已经指向下一个
      else ;//?+-*/方便取余表示先后级
      if(*p=='\0')
      {
        if(str2[0]==11) str3[j]='+';
        else if(str2[0]==12) str3[j]='-';
        else if(str2[0]==21) str3[j]='*';
        else if(str2[0]==22) str3[j]='/';
        else;
        break;
      }
      else if(k>=2)
      {
        if(str2[i-2]/10<str2[i-1]/10) //比较运算先后若同级或者后者大于前者
        {
          p++;
          if(*p>='0'&&*p<='9')
            str3[j++]=*p; //将那个数字放入输出栈
          if(str2[i-1]==21) {str3[j++]='*';i--;k--;}//将后一个放入输出栈
          else if(str2[i-1]==22) {str3[j++]='/';i--;k--;}
          else;                                      //i指回原来最高位子
          if(str2[i-2]==11) {str3[j++]='+';i--;k--;} //下次直接覆盖
          else if(str2[i-2]==12) {str3[j++]='-';i--;k--;}  
          else;                                      
        }
        else if(str2[i-2]/10>=str2[i-1]/10)
        {
        if(str2[i-2]==21) {str3[j++]='*';i--;k--;}//将前一个放入输出栈
        else if(str2[i-2]==22) {str3[j++]='/';i--;k--;}//i指回原来最高位子
        else if(str2[i-2]==11) {str3[j++]='+';i--;k--;} //下次直接覆盖
        else if(str2[i-2]==12) {str3[j++]='-';i--;k--;}  
        else;
        str2[i-1]=str2[i];
        }
      }
    }
  }
  for(p=str3;*p!='\0';p++)
    printf("%c ",*p);
  getch();
  return 0;
}
自己编写的一段中缀表达式转换为后缀表达式的程序(不支持括号),运行完后老是出现多余的俩符号,请高手看看哪里出错了
搜索更多相关主题的帖子: 表达式 
2013-02-10 13:39
逝灬丿
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-2-5
收藏
得分:0 
附上一张图
图片附件: 游客没有浏览图片的权限,请 登录注册

就是这后面俩符号怎么出来的

[ 本帖最后由 逝灬丿 于 2013-2-10 13:42 编辑 ]

QQ截图20130210134018.png (4.04 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
2013-02-10 13:41
逝灬丿
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-2-5
收藏
得分:0 
回复 6楼 心灯甚亮
对哦。谢谢提醒
2013-02-10 15:56
逝灬丿
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-2-5
收藏
得分:0 
回复 6楼 心灯甚亮
直接在读到运算符之后就放一个空格到str3中应该就可以了吧,然后用%s输出
2013-02-10 15:58
逝灬丿
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-2-5
收藏
得分:0 
回复 5楼 心灯甚亮
原来定义数组之后加个={'\0'}是这个用啊、领教了、
2013-02-10 16:02
逝灬丿
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-2-5
收藏
得分:0 
改了之后输出方便多了、恩、支持多位数了、也用上switch了、格式个人感觉看起来舒服些了
程序代码:
//&ordm;ó×&ordm;(&sup2;&raquo;&acute;&oslash;&Agrave;¨&ordm;&Aring;)&Ouml;§&sup3;&Ouml;&para;à&Icirc;&raquo;&Ecirc;&yacute;
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
main()
{
  int i=0,j=0; //i&iquest;&Oslash;&Ouml;&AElig;&Aacute;&Ugrave;&Ecirc;±&Otilde;&raquo;×&icirc;&cedil;&szlig;&micro;&atilde;&pound;&not;J&iquest;&Oslash;&Ouml;&AElig;&Ecirc;&auml;&sup3;&ouml;&Otilde;&raquo;
  int k=0; //&Aacute;&Ugrave;&Ecirc;±&Otilde;&raquo;&micro;&Auml;&Ecirc;&yacute;&Aacute;&iquest;
  char *p;
  char str[100];//&para;&Aacute;&Egrave;&euml;×&Ouml;·&ucirc;&acute;&reg;
  int str2[100];//&Aacute;&Ugrave;&Ecirc;±&Otilde;&raquo;
  char str3[100]={'\0'};//&Ecirc;&auml;&sup3;&ouml;&Otilde;&raquo;
  scanf("%s",str);
  for(p=str;;p++)//&Ouml;&cedil;&Iuml;ò&Ocirc;&shy;×&Ouml;·&ucirc;
  {
    if(*p>='0'&&*p<='9')
      str3[j++]=*p; //&frac12;&laquo;&Auml;&Ccedil;&cedil;&ouml;&Ecirc;&yacute;×&Ouml;·&Aring;&Egrave;&euml;&Ecirc;&auml;&sup3;&ouml;&Otilde;&raquo;
    else 
    {
      switch(*p)
      {
        case('+'):str2[i++]=11;k++;str3[j++]=' ';break;//&Oacute;&ouml;&micro;&frac12;·&ucirc;&ordm;&Aring;&Ouml;&reg;&ordm;ó&Ocirc;&Uacute;&AElig;&auml;
        case('-'):str2[i++]=12;k++;str3[j++]=' ';break;//&Ccedil;°&Atilde;&aelig;&frac14;&Oacute;&Egrave;&euml;&iquest;&Otilde;&cedil;&ntilde;
        case('*'):str2[i++]=21;k++;str3[j++]=' ';break;//i&Ograve;&Ntilde;&frac34;&shy;&Ouml;&cedil;&Iuml;ò&Iuml;&Acirc;&Ograve;&raquo;&cedil;&ouml;
        case('/'):str2[i++]=22;k++;str3[j++]=' ';break;//?+-*/·&frac12;±&atilde;&Egrave;&iexcl;&Oacute;à
      }                                                //±í&Ecirc;&frac34;&Iuml;&Egrave;&ordm;ó&frac14;&para;
      if(*p=='\0')                                   
      {
        switch(str2[0])
        {
          case(11):str3[j]='+';break;
          case(12):str3[j]='-';break;
          case(21):str3[j]='*';break;
          case(22):str3[j]='/';break;
        }
        break;
      }
      else if(k>=2)
      {
        if(str2[i-2]/10<str2[i-1]/10) //±&Egrave;&frac12;&Iuml;&Ocirc;&Euml;&Euml;&atilde;&Iuml;&Egrave;&ordm;ó&Egrave;&ocirc;&Iacute;&not;&frac14;&para;&raquo;ò&Otilde;&szlig;&ordm;ó&Otilde;&szlig;&acute;ó&Oacute;&Uacute;&Ccedil;°&Otilde;&szlig;
        {
          while(*(p+1)>='0'&&*(p+1)<='9')
          {
            p++;
            str3[j++]=*p; //&frac12;&laquo;&frac12;&Oacute;&Iuml;&Acirc;&Agrave;&acute;&Ecirc;&yacute;×&Ouml;·&Aring;&Egrave;&euml;&Ecirc;&auml;&sup3;&ouml;&Otilde;&raquo;
          }
          str3[j++]=' ';
          switch(str2[i-1])
          {case(21):str3[j++]='*';str3[j++]=' ';i--;k--;break;//&frac12;&laquo;&ordm;ó&Ograve;&raquo;&cedil;&ouml;·&Aring;&Egrave;&euml;&Ecirc;&auml;&sup3;&ouml;&Otilde;&raquo;
           case(22):str3[j++]='/';str3[j++]=' ';i--;k--;break;}//i&Ouml;&cedil;&raquo;&Oslash;&Ocirc;&shy;&Agrave;&acute;×&icirc;&cedil;&szlig;&Icirc;&raquo;×&Oacute;
          switch(str2[i-2])
          {case(11):str3[j++]='+';str3[j++]=' ';i--;k--;break;
           case(12):str3[j++]='-';str3[j++]=' ';i--;k--;break;}                                                        
        }
        else if(str2[i-2]/10>=str2[i-1]/10)
        {
          switch(str2[i-2])
          {
            case(11):str3[j++]='+';str3[j++]=' ';i--;k--;break;//&frac12;&laquo;&Ccedil;°&Ograve;&raquo;&cedil;&ouml;·&Aring;&Egrave;&euml;&Ecirc;&auml;&sup3;&ouml;&Otilde;&raquo;
            case(12):str3[j++]='-';str3[j++]=' ';i--;k--;break;//i&Ouml;&cedil;&raquo;&Oslash;&Ocirc;&shy;&Agrave;&acute;×&icirc;&cedil;&szlig;&Icirc;&raquo;×&Oacute;
            case(21):str3[j++]='*';str3[j++]=' ';i--;k--;break;//&Iuml;&Acirc;&acute;&Icirc;&Ouml;±&frac12;&Oacute;&cedil;&sup2;&cedil;&Ccedil;
            case(22):str3[j++]='/';str3[j++]=' ';i--;k--;break;
          }
          str2[i-1]=str2[i];
        }
      }
    }
  }
  printf("%s",str3);
  getch();
  return 0;
}
2013-02-10 16:25
快速回复:关于中缀转后缀表达式的小问题、
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022265 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved