栈的顺序存储实现





#include
#include

using namespace std;

#define STACK_SIZE 100

struct Stack{
    int *top;
    int *base;
    int Size;
}Stack;

/**********************
 * Function Statements
**********************/

bool InitStack(struct Stack &S); //构建栈
bool IsEmpty(struct Stack &S); //判断栈空
bool IsFull(struct Stack &S); //判断栈满
void Push(struct Stack &S, int e); //压栈,插入数据
void Pop(struct Stack &S, int &e); //删除,即弹出数据
bool DestroyStack(struct Stack &S); //销毁栈
bool ClearStack(struct Stack &S); //清空栈
void PrintStack(struct Stack &S); //打印栈中元素,即输出

/**********************
       * Main *
***********************/

int main()
{
    struct Stack S;
    int b, n;
    if(InitStack(S)==false){
        cout << "Init Stack error!" << endl;
        exit(0);
    }
    cout << "push a data into stack:" << endl;

    cin >> n;

    //压栈
    cout << "压栈操作" << endl;
    while(n--){
        Push(S, n);
        PrintStack(S);
    }

    //弹栈
    cout << "弹栈操作" << endl;
    while(n<4){
        Pop(S, b);
        PrintStack(S);
        n++;
    }

    //清栈
    cout << "清栈操作" << endl;
    if(ClearStack(S))
        PrintStack(S);

    //销毁栈
    cout << "销毁栈操作" << endl;
    DestroyStack(S);
    cout << "S.base = " << S.base << ";  " <<"S.top = " << S.top << ";  "
         << "S.Size = " << S.Size << endl;

    return 0;
}

/*******************************
 * PrintStack
 * 打印栈中的元素,自顶向下显示
 * 即从栈尾输出到栈首
*******************************/

void PrintStack(struct Stack &S){
    int n = S.top - S.base;
    int index;
    //若栈空则输出
    if(!n){
        cout << ".................................." << endl;
        cout << "Stack is Empty..."<= B, 则表示栈溢出
******************************************/

bool IsFull(struct Stack &S){
    int A = S.top - S.base;
    int B = S.Size;
    if(A >= B){
        cout << "Stack is Full" << endl;
        return true;
    }
    else
        return false;
}

/************************************************************
 *Push
 *压栈操作
 *栈是特殊的线性表,其不支持随机访问,因此只能按照顺序存储。
 *例如:子弹夹上子弹(该例子与本实现不同的是
 *++子弹夹栈顶指针保持不变,栈底指针游动。
 *++本程序实现的是栈底指针不变,栈顶指针游动。)

*************************************************************/

void Push(struct Stack &S, int e){
    if(!IsFull(S)){
        *(S.top) = e;
        S.top ++;
    }
}

/******************************************************************
 * Pop
 * 弹栈操作
 *     栈是特殊的线性表,其不支持随机访问,因此只能按照顺序存储。
 *     例如:子弹夹推出子弹(该例子与本实现不同的是
 *            ++子弹夹栈顶指针保持不变,栈底指针游动。
 *            ++本程序实现的是栈底指针不变,栈顶指针游动。)
*******************************************************************/

void Pop(struct Stack &S, int &e){
    if(IsFull(S)){
        cout << "Pop error" << endl;
    }
    else{
        e = *(S.top - 1);
        S.top --;
    }
}


点击打开链接


你可能感兴趣的:(★资料)