博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一个通俗易懂的表达式。

Posted on 2010-04-29 19:45  ccmfc  阅读(243)  评论(0编辑  收藏  举报

今天上午下了下昨天的代码。。。。改了一小部分。。。

能够实现对表达式的求值了。。。

但是没对它的容错进行处理了。。。。总的来说功能是实现了。。

但是自己觉得不满意。。。。不满意自己写的代码。。。为什么别人能写出高效的代码。。。

而我却。。。。。总结了一下原因。。。基础没有打牢固。。。有些东西用不习惯。。。例如泛型算法中的List。。.

Vector也不是经常用。。。。

所以本人要闭关去了。。。。。赶快打好基础。。。。早日出关。。。。

 

 

//转换成后缀表达式用数组保存字符
int MidToBack(char *tPtr)
{
 Stack<char> s;
 char *tChar = tPtr;
 int tRet;
 int i=0;
 char tSave[MAXSIZE];
 bool uNumber = false;

 //检测首字符是否为负数
 if(*tChar == '-')
 {
  tSave[i] = *tChar;
  ++i;
  ++tChar;
  goto Number;
 }

 while(*tChar)
 {
  if(*tChar == ' ')
  {
   ++tChar;
   continue;
  }
  else if(::isdigit(*tChar))
  {
Number:
   while((*tChar >= '0') && (*tChar <= '9'))
   {
    tSave[i] = *tChar;
    ++i;
    ++tChar;
   }
   if(*tChar == '.')
   {
    tSave[i] = *tChar;
    ++i;
    ++tChar;
    while((*tChar >= '0') && (*tChar <= '9'))
    {
     tSave[i] = *tChar;
     ++i;
     ++tChar;
    }
   // --tChar;
   }
   --tChar;
   tSave[i] = ' ';
   ++i;

  }
  else if((*tChar == '+') || (*tChar == '-') || (*tChar == '*')||
       (*tChar == '/') || (*tChar == '(') || (*tChar == ')')||
    (*tChar == '[') || (*tChar == ']') || (*tChar == '{')||
    (*tChar == '}'))
  {
   if(s.IsEmpty() || *tChar == '{' || *tChar == '[' || *tChar == '(')
   {
    s.Push(*tChar);
    if(*(tChar+1) == '-')
    {
     ++tChar;
     tSave[i] = *tChar;

     ++i;
     ++tChar;
     goto Number;
    }
   }
   else
   {
    //对特殊字符的处理例如'}'']'')'
    if((*tChar == '}') || (*tChar == ']') || (*tChar == ')'))
    {
     char tTemp;
     switch(*tChar)
     {
     case ')':tTemp='(';
      break;
     case ']':tTemp='[';
      break;
     case '}':tTemp='{';
      break;
     default:
      break;
     }
     while(tTemp != s.Top())
     {
      tSave[i] = s.Top();
      ++i;
      tSave[i] = ' ';
      ++i;
      s.Pop();
     }
     s.Pop();
    }
    else     //对特殊字符的处理例如'+''-''*''/'
    { 
     tRet = Judge(s.Top(),*tChar);
     if(tRet == 1)
     {
      s.Push(*tChar);
     }
     else
     {
      tSave[i] = s.Top();
      ++i;
      tSave[i] = ' ';
      ++i;
      s.Pop();
      s.Push(*tChar);
     }
    }
   }
  }
  else
  {
   cout<<"输入出错\n";
   return -1;
  }
  tChar++;
 }


 while(!s.IsEmpty())
 {
  tSave[i] = s.Top();
  ++i;
  tSave[i] = ' ';
  ++i;
  s.Pop();
 }
 strncpy(tPtr, tSave, i);
 tPtr[i] = '#';
 return 1;
}