• 栈的顺序存储实现


    
    
    
    #include<iostream>
    #include<stdlib.h>
    
    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..."<<endl;
            cout << ".................................." << endl;
            return;
        }
        //非空时
        cout << ".................................." << endl;
        cout << "栈中的数据(从栈顶元素開始向下显示)" << endl;
        for(index = 1; index<=n; ++index){
            cout << *(S.top - index) << " ";
        }
        cout << endl;
    }
    
    /*******************************
     *InitStack
     *动态分配内存
     *并对栈的属性初始化
    *******************************/
    
    bool InitStack(struct Stack &S){
        S.base = (int* ) malloc (STACK_SIZE *sizeof(Stack));
        if(S.base == NULL){
            cout << "malloc stack error" << endl;
            return false;
        }
        S.top = S.base;
        S.Size = STACK_SIZE;
        return true;
    }
    
    /*******************************
     *ClearStack
     *清空栈内数据
    *******************************/
    
    bool ClearStack(struct Stack &S){
        S.top = S.base;
        return true;
    }
    
    /*******************************
     *DestroyStack
     *销毁栈S。释放内存
     *并将指针属性置空
     *防止悬浮指针产生
    *******************************/
    
    bool DestroyStack(struct Stack &S){
        free(S.base);
        S.base = NULL; //不用的指针一定用指向空
        S.top = NULL;  //防止悬浮指针的产生
        S.Size = 0;
        return true;
    }
    
    /*******************************
     *IsEmpty
     *推断栈是否为空
     *即推断S.top == S.base ?
     *若S.top == S.base 则表示栈空
    *******************************/
    
    bool IsEmpty(struct Stack &S){
        if(S.top == S.base)
            return true;
        else
            return false;
    }
    
    /******************************************
     *IsFull
     *推断栈是否存满
     *A = S.top - S.base 代表此时栈中全部元素
     *B = S.Size 表示栈被分配的空间
     *若A >= 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 --; } }


    点击打开链接


  • 相关阅读:
    二进制位运算
    Leetcode 373. Find K Pairs with Smallest Sums
    priority_queue的用法
    Leetcode 110. Balanced Binary Tree
    Leetcode 104. Maximum Depth of Binary Tree
    Leetcode 111. Minimum Depth of Binary Tree
    Leetcode 64. Minimum Path Sum
    Leetcode 63. Unique Paths II
    经典的递归练习
    案例:java中的基本排序
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6920127.html
Copyright © 2020-2023  润新知