チェーンスタックの実装


#include <iostream>
#include <stdlib.h>

using namespace std;

typedef int Elemtype;
typedef struct Node {
    Node *lNext;
    Elemtype eData;
} *LinkedStack;

//    
LinkedStack initNode();
void showStack(LinkedStack);
void initStack(LinkedStack , int);
int stackLength(LinkedStack);
bool isEmptyStack(LinkedStack);
Elemtype getTop(LinkedStack);
void push(LinkedStack , Elemtype);
Elemtype pop(LinkedStack);
void clearStack(LinkedStack);

int main()
{
    LinkedStack ls = initNode();
    cout << "              :" << endl;
    int iSize;
    cin >> iSize;
    cout << "       :" << endl;
    initStack(ls , iSize);
    cout << "     :" << endl;
    showStack(ls);

    //            
    //cout << "        :" << stackLength(ls) << endl;

    //         
    /*bool bEmpty = isEmptyStack(ls);
    if(bEmpty) {
        cout << "           !" << endl;
    } else {
        cout << "   !" << endl;
    }*/

    //        
    /*Elemtype eReturn = getTop(ls);
    cout << "     :" << eReturn << endl;*/

    //      
    /*Elemtype eValue;
    cout << "         :" << endl;
    cin >> eValue;
    push(ls , eValue);
    cout << "   ,       :" << endl;
    showStack(ls);*/

    //      
    Elemtype eDelete = pop(ls);
    cout << "      :" << eDelete << endl;
    cout << "       :" << endl;
    showStack(ls);

    //     
    cout << "   ……" << endl;
    clearStack(ls);
    showStack(ls);

    return 0;
}

//     
LinkedStack initNode() {
    LinkedStack lReturn = (LinkedStack)malloc(sizeof(Node));
    lReturn->lNext = NULL;
    return lReturn;
}

//    
void initStack(LinkedStack lHead , int iSize) {
    if(lHead->lNext != NULL) {
        lHead->lNext = NULL;
    }
    for(int i = 0; i < iSize; i++) {
        Elemtype eValue;
        cin >> eValue;
        push(lHead , eValue);
    }
}

//        
int stackLength(LinkedStack lHead) {
    int length = 0;
    while(lHead->lNext != NULL) {
        length++;
        lHead = lHead->lNext;
    }
    return length;
}

//        
void showStack(LinkedStack lHead) {
    if(isEmptyStack(lHead)) {
        cout << "         !" << endl;
        return;
    }
    lHead = lHead->lNext;
    while(lHead != NULL) {
        cout << lHead->eData << "  ";
        lHead = lHead->lNext;
    }
    cout << endl;
}

//         
bool isEmptyStack(LinkedStack lHead) {
    if(lHead->lNext == NULL) {
        return true;
    }
    return false;
}

//      
Elemtype getTop(LinkedStack lHead) {
    if(isEmptyStack(lHead)) {
        cout << "         !" << endl;
        return -1;
    }
    return lHead->lNext->eData;
}

//  
void push(LinkedStack lHead , Elemtype eValue) {
    LinkedStack lNew = initNode();
    lNew->eData = eValue;
    lNew->lNext = lHead->lNext;
    lHead->lNext = lNew;
}

//  
Elemtype pop(LinkedStack lHead) {
    if(isEmptyStack(lHead)) {
        cout << "         !" << endl;
        return -1;
    }
    LinkedStack lDelete = lHead->lNext;
    lHead->lNext = lDelete->lNext;
    Elemtype eReturn = lDelete->eData;
    free(lDelete);
    return eReturn;
}

//   
void clearStack(LinkedStack lHead) {
    if(isEmptyStack(lHead)) {
        return;
    }
    while(!isEmptyStack(lHead)) {
        LinkedStack lDelete = lHead->lNext;
        lHead->lNext = lDelete->lNext;
        free(lDelete);
    }
}

//   
void destoryStack(LinkedStack lHead) {
    clearStack(lHead);
    free(lHead);
}