2014-02-17 9 views
-7

Ниже приведен код на С ++ на stack.Ignore дополнительный код здесьпоп() не работает должным образом

#include<iostream> 
using namespace std; 
class mystack 
{ 
    private: 
     int top; 
     int size; 
     int * s; 
    public: 
     void initialize() 
     { 
      top=-1; 
      cin>>size; 
      s=new int[size]; 
     } 
     ~mystack(){delete [] s;} 
     void push() 
     { 
      int x; 
      if(top==size-1) 
       cout<<"stack overflow!"<<endl; 
      else 
      { 
       cout<<"Enter element to be pushed:"; 
       cin>>x; 
       top++; 
       s[top]=x; 
       cout<<s[top]<<endl; 
      } 
     } 
     int pop() 
     { 
      int p=s[top]; 
      if(top==-1) 
       return 0; 
      else 
      { 
       top--; 
       return p; 
      } 
     } 
     int maxsize() 
     { 
      return size; 
     } 
     int isempty() 
     { 
      if(top==-1) 
       return 0; 
      else 
       return 1; 
     } 
     void display() 
     { 
      int i,p=top; 
      cout<<s[0]<<endl; 
      for(i=0;i<=p;i++) 
       cout<<s[i]<<endl; 
     } 
}; 
int main() 
{ 
    int n,i; 
    cout<<"Enter no. of stacks:"; 
    cin>>n; 
    mystack * st=new mystack[n]; 
    for(i=0;i<n;i++) 
    { 
     cout<<"Enter size of stack "<<i+1<<":"; 
     st[i].initialize(); 
    } 
    int c,s; 
    while(1) 
    { 
     cout<<"*****Operations*****"<<endl; 
     cout<<"1.Push 2.Pop 3.Maxsize 4.isempty 5.Display 6.Quit"<<endl; 
     cout<<"Enter your choice:"; 
     cin>>c; 
     if(n>1) 
     { 
      cout<<"Operation on which stack:"; 
      cin>>s; 
     } 
     else 
      s=1; 
     if(c==1) 
      st[s-1].push(); 
     else if(c==2) 
     { 
      if(st[s-1].pop()==0) 
       cout<<"stack underflow!"<<endl; 
      else 
       cout<<st[s-1].pop()<<endl; 
     } 
     else if(c==3) 
      cout<<st[s-1].maxsize()<<endl; 
     else if(c==4) 
     { 
      if(st[s-1].isempty()==0) 
       cout<<"True"<<endl; 
      else 
       cout<<"False"<<endl; 
     } 
     else if(c==5) 
      st[s-1].display(); 
     else if(c==6) 
      break; 
     else 
     { 
      cout<<"Wrong input!"<<endl; 
      continue; 
     } 
    } 
    return 0; 
} 

Здесь доступ к операции поп дает элемент верхнего 1.I не может понять why.What должен ли я это делать? Когда я вернусь, [топ -], происходит то же самое.

+2

Я предлагаю решить проблему с 1 стэком и получить лучшее представление о том, что делает ваш код. – jeremy

+1

Некоторые общие рекомендации: отделите логику ввода от вашего push/initialize/и т. Д., Проверьте 'top == - 1' * перед * доступом к массиву, и у вас должен быть конструктор, который инициализирует вещи. – crashmstr

+0

Здесь «top--; return p;» сначала нужно сохранить то, что вы хотите вернуть, а затем уменьшить - в соответствии с вашим нажатием. Но сначала прочитайте предложения. – Artur

ответ

0

Поскольку вы еще не вернулись к этому, я предполагаю, что вы уже нашли свою логическую ошибку.

Итак, вот одна ошибка, которую я нашел. Может быть больше, я прекратил искать ...

В следующем коде сколько раз вызывается pop()?

else if(c==2) 
    { 
     if(st[s-1].pop()==0) 
      cout<<"stack underflow!"<<endl; 
     else 
      cout<<st[s-1].pop()<<endl; 
    } 
+0

, конечно, раз в один раз –

+0

i.e. Не использовать действие, изменяющее стек (pop), чтобы обнаружить нижнее течение. Вместо этого используйте проверку статуса, например isempty(). Еще один тест, который следует учитывать: что происходит, когда пользователь нажимает 1, 2, 3, 0 в один и тот же стек, затем поп, поп, поп, поп, поп? –

+0

все в порядке Я исправлю это ... но я думаю, что это не проблема. Когда я появляюсь, почему возвращается элемент перед верхом? –

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