【问题标题】:Separating a single string into multiple stacks将单个字符串分成多个堆栈
【发布时间】:2012-10-20 10:28:54
【问题描述】:

我要做的是获取一个字符串,例如“((4 + 2)/ 2)”,然后评估它,返回 3。我应该通过将字符串分成三个单独的堆栈来做到这一点。 . 一个用于左括号 '(',一个用于数字 '0' - '9',一个用于运算符,'+' '-' '*' '/' 和 '%'。

我遇到的问题实际上是将字符串分成堆栈。我的代码如下:

//The evaluate function takes a string containing an arithmetic expression,
//evaluates it,and returns its result
int evaluate(string exp)
 {
 stack<char> parStack;
 stack<int> numStack;
 stack<char> opStack;

 int j = exp.size();
 int i=0;
 char x;

 //for (i=0; i<j; i++)
 //{
 while (i<j)
 {
     if(exp[i] = '(')
     {
         parStack.push(exp[i]);
         cout << exp[i] << endl;  // just to see what is being pushed
     }
     if((exp[i]='0') || (exp[i]='1') || (exp[i]='2') || (exp[i]='3') || (exp[i]='4') || (exp[i]='5') || (exp[i]='6') || (exp[i]='7') || (exp[i]='8') || (exp[i]='9'))  // I feel this is terribly inefficient
     {
         numStack.push(exp[i]);
     }
     if((exp[i] = '+') || (exp[i] = '-') || (exp[i] = '*') || (exp[i] = '/') || (exp[i] = '%'))
     {
         opStack.push(exp[i]);
     }
     i++;
 }
 //}  // end for

 return -1;

 }  // end evaluate

如您所见,我尝试使用 for 循环和 while 循环来解决这个问题,两者都给出了相同的结果。发生的情况是,由于某种原因,如果我输入“(5 + 3)”,它会打印出“(((((”)作为被推送的内容。为什么我的 if 语句会像这样重复自己?暂时忽略返回最后 -1,因为这将完成以实际评估字符串,我确信我可以处理,一旦我可以有效地创建堆栈。

【问题讨论】:

    标签: c++ string loops stack


    【解决方案1】:

    你应该在你的 if 语句中使用两个“=”

    if(exp[i] = '(')  //wrong (your code)
    if(exp[i] == '(') //right
    

    【讨论】:

    • 哇,我觉得自己很笨。我绝对应该能够看到这一点。这困扰了我大约两个小时... -_- 谢谢!
    【解决方案2】:

    您使用了 = 运算符而不是 == 运算符。当代码执行 '(' 的 ascii 值时,会在 if 条件中检查并分配给您的字符串。只需将其更改为 == 您的代码就可以正常工作....

    【讨论】:

    • 我不敢相信我没有看到这一点。我知道它是如此简单。感谢您的帮助!案件结案。
    【解决方案3】:

    出于实际目的,您可能希望更改 if 条件以使用字符串搜索,如下所示:

    const char OPEN_PARAN = '(';
    const string digits = "0123456789";
    const string operators = "*-+%";
    
    
    //...
    while(i < j){
      if(exp[i] == OPEN_PARAN){ ... }
      else if(digits.find(exp[i]) != string::npos){ ... }
      else if(operators.find(exp[i]) != string::npos){ ... }
      else{ ... }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 2014-01-26
      • 2017-03-30
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 2019-03-14
      相关资源
      最近更新 更多