将单个字符串分成多个堆栈

时间:2012-10-31 01:13:40

标签: c++ string loops stack

我想要做的是取一个字符串,说“((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,因为一旦我可以有效地创建堆栈,就会完成实际评估字符串,我确信我可以处理它。

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

你使用了=运算符而不是==运算符。当代码执行ascii值'('如果条件已签入并且也被分配给您的字符串。只需将其更改为==您的代码将正常工作....

答案 2 :(得分:1)

同样出于实际目的,您可能希望更改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{ ... }
}