#include<iostream>
#include<process.h>
#include <conio.h>
using namespace std;
#define size 20;
class stack
{
        int a[size];  // هذه مصفوفة لحجم الستاك الكلي
        int tos;      // مؤشر لمعرفة حدود الستاك في حالة الاضافة والحذف لمعرفة الى اين وصل الستاك
public:
        stack();         //دالة كونستركنتر لاعطاء قيمة ابتدائية للمئشر ومن اين ابدا به ويفضل من -1 حتى يأخذ موقع الصفر حتى لا يضيع
        void push(int);   // دالة الاضافة الى مصفوفة الاستاك
        int pop();        //دالة الحذف من مصفوفة الستاك
        int isimpty();    //  دالة لفحص الستاك عند الحذف لمعرفةته هل فرغ ام لا لحذف عنصر من داخل الستاك
        int isfull();     // دالة لفحص الستاك عند الاضافة لمعرفة هل امتلئ ام لا للاضافة عنصر جديد
        void topelem();
        void display();    // دالة لطباعة محتويات الستاك
};
stack::stack()
{
        tos=0;
}
int stack::isimpty()
{
        return(tos==0?1:0);  // هنا اذا كان المؤشر يساوي صفر يعني الستاك فارغ رجع قيمة 1 واذا لا رجع صفر
}
int stack::isfull()
{
        return(tos==size?1:0);  //  هنا اذا كان المؤشر يساوي صفر يعني الستاك مملوء رجع قيمة 1 واذا لا رجع صفر
}
void stack::push(int i)
{
        if(!isfull())   //  اذا دالة الفول لاتساوي 1 يعني غير مملوء اضف العنصر الجديد الي هو حرف الاي بالانكليزي الى مصفوفة الستاك وقدم المؤشر خطوة
        {
                a[tos]=i; // هنا الاضافة
                tos++;  // هنا تقديم المؤشر
        }
        else
                cout<<"stack overflow !possible data loss!"; // واذا دالة الفول تساوي واحد يعني الستاك مملوء فتظهر هذه الرسالة
}
}
int stack::pop();  
{
        if(!isempty())  // اذا دالة الامبتي لاتساوي 1 يعني غير فارغ احذف العنصر من مصفوفة الستاك ورجع المؤشر خطوة
        {
                {
                        int data=a[tos]; // ارجاع القيمة من المصفوفة الى متغير لذفه
                        a[tos]=Null;  // حذف القيمة
                        tos--;  // تنقيص المؤشر
                }
                return(a[tos])  // ارجاع القيمة المحذوفة لعرضها ع الشاشة فقط
        }
        else
        {
                cout<<"stack is empty!what to pop....!"; // واذا دالة الامبتي تساوي 1 يعني الستاك فارغ فتظهر هذه الرسالة تخبرنا ان الستاك فارغ ولايمكن الحذف لانه فارغ
        }
        void stack::display()  // دالة الطباعة لطباعة ما بداخل مصفوفة الستاك ع الشاشة
        {
                int j=0;
                int elem=0;
                while(tos!j)  // اذا كان مؤشر الستاك لايساوي صفر يعني غير فارغ
                {
                        elem=a[j]; // حول القيمة من المصفوفة الى متغير
                        cout<<"the element in the location of ["<<j<<"] is  "<<elem<<endl; // اطبع المتغير هنا 
                        ++j; زود العداد ليذهب للموقع الثاني
                }
        }
        return0;
}

void stack ::topelem()
{
        cout<<"the most top element is"<<a[tos-1]<<endl;
}
void main()// البرنامج الرئيسي حيث سوف نحدد العمليات التي سوف اقوم بها عن طريق السوج كيس يعني احددة نوع العملية برقم مثل للخروج 0 وللاضافة 1 وللحذف 2 وهكذا وعند اختيار الرقم يذهب للاعلى الى الدالة ليقوم بالعمل
{
        stack s;
        int ch;
        int ch=1,num;
        while(ch!=0)
        {
                cout<<"stack operations main menu 1.push  2.pop  3.isempty  4.isfull  5.display  6.topelem  0.exit";
                switch(ch)
                {
                case 0:
                        exit(1);
                case 1:
                        cout<<"enter the num to push";
                        cin>>num;
                        s.push(num);
                        break;
                case 2:
                        
                        cout<<" num popped from the stack is : ";
                        
                        s.pop();
                        break;
                        
                case 3:
                        (s.isimpty())?(cou<<"stack is empty."):(cout<<"stack is notempty.");
                        
                        
                        break;
                case 4:
                        (s.isfull())?(cou<<"stack is empty."):(cout<<"stack is notfull.");
                        
                        
                        break;
                case 5:
                        cout<<"enter the num to push";
                        
                        
                        s.display();
                        break;
                case 6:
                        
                        
                        s.topelem();
                        break;
                default:
                        cout<<"illegal option .please  try again";
                }
                
                
                
                getch();
                
        }
}



