1. 程式人生 > >c++實現鏈棧的基本操作(附帶main函式 可編譯執行)

c++實現鏈棧的基本操作(附帶main函式 可編譯執行)

資料結構老師佈置了鏈棧的基本操作,讓我們儘量嘗試用class實現,然後我在網上參考了一部分,自己寫了一個,有不足之處懇請大家指出

/*

 *  檔名:鏈棧.c
 *    鏈棧的實現
 *    版本:2.0
 *    時間:2016.11.4
 *    作者:WangYan
 *    假定條件: 假設元素的基本型別為int,且每個元素只有一個整數資訊需要壓棧
 *
*/

#include<iostream>
#define OK 1
#define ERROR -1

using namespace std;

typedef int Elemtype;
typedef struct Stacknode
{
    Elemtype data;
    struct Stacknode *next;
}snode;

class LinkStack
{
public:
    LinkStack();
    int Push(Elemtype data);   //進棧
    int Pop();                  //出棧   Elemtype &data
    int Clear();            //清空鏈棧
    bool isEmpty();         //判空
    int print() const;      //列印鏈棧內元素

    ~LinkStack();           //析構,銷燬
    static int Count;        //存放棧的大小
    snode *top;    //棧頂指標
//protected:

};

/**初始化棧的長度*/
int LinkStack::Count = 0;


/***********************
初始化鏈棧
呼叫建構函式
***********************/
LinkStack::LinkStack()
{
    top = NULL;        //top = NULL表示鏈棧為空
}


/***********************
銷燬鏈棧
解構函式
***********************/
LinkStack::~LinkStack()
{
    snode *p = NULL;
    while(top)           //迴圈釋放節點
    {
        p = top->next;
        delete top;
        top = p;
    }
}


/***********************
進棧操作
Push
data為進棧的資料
***********************/
int LinkStack::Push(Elemtype data)
{
    snode *snew = new snode;    //建立新節點

    snew->data = data;          //新節點賦值
    snew->next = top;           //新棧頂指向舊棧頂
    top  = snew;                //top指向新棧頂
    Count ++;

    return OK;
}


/***********************
出棧操作
Pop
***********************/
int LinkStack::Pop()
{
    if(!top)
        return ERROR;
    if(isEmpty() == 1)
    {
        cout<<"棧為空"<<endl;
        return OK;
    }

    snode *p = top->next;       //預存下一節點的指標
    //data = top->data;          //將棧頂元素返回給主函式使用

    delete top;                 //釋放棧頂空間
    top = p;                    //棧頂下移
    Count --;

    return OK;
}

/***************
判斷鏈棧是否為空
IsEmpty
****************/
bool LinkStack::isEmpty()
{
    return (top == NULL);       //棧頂為空則返回1 ,不為空返回0
}

/***********************
清空鏈棧
Clear
形式同解構函式
***********************/
int LinkStack::Clear()
{
    snode *p;
    while(top)                  //迴圈釋放節點
    {
        p = top;
       top = top->next;
        delete p;
    }
    return OK;
}

/***********************
列印鏈棧中元素
print
通過遍歷鏈棧列印元素值
***********************/
int LinkStack::print() const
{
    snode *p = top;
    while(p && Count)            //棧不為空 && 棧中存在資料
    {
        cout<<p->data<<ends<<ends;   //遍歷列印棧中資料
        p = p->next;
    }
    return OK;
}

int main()
{
    LinkStack ls;      //定義物件 ls
    int x;              //選擇數,兼輸入鏈棧的元素值

    cout<<"******************************* "<<endl;
    cout<<"請選擇要進行的操作: "<<endl;
    cout<<"初始化  "<<endl;
    cout<<"1: 壓棧  "<<endl;
    cout<<"2:出棧  "<<endl;
    cout<<"3:判斷鏈棧是否為空  "<<endl;
    cout<<"4:清空鏈棧  "<<endl;
    cout<<"5:顯示鏈棧長度  "<<endl;
    cout<<"6:列印鏈棧  "<<endl;
    cout<<"銷燬鏈棧"<<endl;
    cout<<"******************************* "<<endl;
    cout<<"請輸入要進行的操作:"<<endl;

    while(cin>>x)
    {
        switch (x)
        {
            case 1:
                cout<<"輸入壓棧資料:(末尾輸入0結束)"<<endl;
                cin>>x;
                while(x)
                {
                    ls.Push(x);
                    cin>>x;
                }

                cout<<endl<<"請輸入下一步操作:";
                break;
            case 2:
                if(ls.isEmpty())
                    cout<<"鏈棧為空棧"<<endl;
                while(ls.top)
                {
                   ls.Pop();
                }
                cout<<endl<<"請輸入下一步操作:";
                break;
            case 3:
                if(ls.isEmpty())
                    cout<<"鏈棧為空棧"<<endl;
                else
                    cout<<"鏈棧不為空"<<endl;

                cout<<endl<<"請輸入下一步操作:";
                break;
            case 4:
                ls.Clear();
                cout<<endl<<"請輸入下一步操作:";
                break;
            case 5:
               cout<<ls.Count<<endl;
                cout<<endl<<"請輸入下一步操作:";
                break;
            case 6:
                if(ls.isEmpty())
                    cout<<"鏈棧為空棧"<<endl;
                else
                    ls.print();
                cout<<endl<<"請輸入下一步操作:";
                break;
            default: break;
        }

    }


    return 0;
}