2013-04-23 6 views
1

Я запускаю это и набираю «12+» в качестве выражения. Когда он добирается до цикла while, он застревает, как будто условие никогда не выполняется. Я не понимаю, почему это происходит потому, что перед циклом while «он» равен 2, поэтому цикл не должен использоваться.Почему мое условие «пока» не выполняется?

//array based stack implementation 
class Stack 
{ 
private: 
    int capacity;  //max size of stack 
    int top;   //index for top element 
    char *listArray;  //array holding stack elements 

public: 
    Stack (int size = 50){ //constructor 
     capacity = size; 
     top = 0; 
     listArray = new char[size]; 
    } 

    ~Stack() { delete [] listArray; } //destructor 


    void push(char it) { //Put "it" on stack 
     listArray[top++] = it; 
    } 
    char pop() { //pop top element 
     return listArray [--top]; 
    } 

    char& topValue() const { //return top element 
     return listArray[top-1]; 
    } 

    char& nextValue() const {//return second to top element 
     return listArray[top-2]; 
    } 


    int length() const { return top; } //return length 



}; 

int main() 
{ 
    string exp; 
    char it = ' '; 
    int count; 
    int push_length; 


    cout << "Enter an expression in postfix notation:\n"; 
    cin >> exp; 
    cout << "The number of characters in your expression is " << exp.length() << ".\n"; 
    Stack STK; 

    for(count= 0; count < exp.length() ;count++) 
    { 

     if (exp[count] == '+') 
     { 
      it = exp[count - 1]; 
      cout << it << "\n"; 


      while (it != 1 || it != 2 || it != 3 || it != 4 || it != 5 || it != 6 || it != 7 || it != 8 || it != 9 || it != 0) 
      { 
       cout << it << "\n"; 
       it = exp[count--]; 
      } 

      STK.push(it); 
      //cout << STK.topValue() << "\n"; 

      it = exp[count --]; 
      if (it == 1 || it == 2 || it == 3 || it == 4 || it == 5 || it == 6 || it == 7 || it == 8 || it == 9 || it == 0){ 
       STK.push(it); 
       cout << it; 
      } 
      cout << STK.topValue() << "\n"; 
      it = STK.topValue() + STK.nextValue(); 
      STK.pop(); 
      STK.pop(); 
      STK.push(it); 
      cout << STK.topValue() << "\n"; 

     } 


    } 
    cout << "The number of characters pushed into the stack is " << STK.length() << ".\n"; 
    push_length = STK.length(); 



    return(0); 
} 
+0

Вы сравниваете от значения полукокса 1, который не является так же как значение char '1'. – Joe

+0

Проблема с циклом, который работает на неопределенный срок или не выполняется в ожидании, - прекрасное время, чтобы научиться использовать отладчик. Найдите, как использовать отладчик с любым компилятором и идеей, который вы используете. По сути, это позволит вам запустить программу, а затем приостановить ее прямо перед циклом и проверить все значения переменных. Вы можете даже наблюдать определенные переменные и выражения. т. е. вы могли бы узнать, является ли это! = 1 истинным или ложным в любой момент во время выполнения. Я начал использовать отладчик после программирования в течение длительного времени, хотелось бы, чтобы я узнал ранее. – Joshua

+0

Я вернул свой вопрос. С вашим редактированием вопрос не имеет смысла. Если у вас есть дополнительные вопросы о фиксированном коде, пожалуйста, откройте новый вопрос. – avakar

ответ

6

Как вы говорите, ваша статья while всегда true.

while (it != 1 || it != 2 || it != 3 || it != 4 || it != 5 || it != 6 || it != 7 || it != 8 || it != 9 || it != 0) 

it всегда не быть некоторые из этих чисел.

Вы могли меняться каждый || к && в этом заявлении, так что, скорее всего, что вы имели в виду. И изменить 1 к '1', 2 к '2', и так далее ...

Четкое подход будет:

while (!std::isdigit(it)) 

http://en.cppreference.com/w/cpp/string/byte/isdigit

+0

ОК, поэтому я пошел по более легкому маршруту и ​​использовал время (! Isdigit (it)). Спасибо за этот совет! –

+0

Теперь я пытаюсь добавить верхнее значение и следующее значение, и он продолжает давать мне результат «c». Я ищу 3, поэтому его не за горами, и я знаю его, потому что это значение char, но есть ли способ получить это «c» и преобразовать его в 3? –

+0

@RichardRyan Опубликовать это как новый вопрос, и вы получите гораздо больше глаз на него. И если вы считаете, что это ответили на ваш вопрос, отметьте его как * принятый *, и вы получите хороший удар по вашей репутации. :) Удачи! –

Смежные вопросы