zoukankan      html  css  js  c++  java
  • 顺序栈

     1 //Stack.h
     2 
     3 #ifndef STACK_H
     4 #define STACK_H
     5 
     6 #define OK 1
     7 #define ERROR 0
     8 typedef int Status;
     9 typedef int SElemType;
    10 #define STACK_INIT_SIZE 100
    11 #define STACKINCREMENT 10
    12 typedef struct {
    13     SElemType *base;//栈底指针
    14     SElemType *top; //栈顶指针
    15     int stacksize;  //当前已分配的存储空间
    16 }SqStack;
    17 Status InitStack(SqStack &S);
    18 Status DestoryStack(SqStack &S);
    19 Status ClearStack(SqStack &S);
    20 Status StackEmpty(SqStack &S);
    21 int StackLength(SqStack S);
    22 Status GetTop(SqStack S, SElemType &e);
    23 Status Push(SqStack &S, SElemType e);
    24 Status Pop(SqStack &S, SElemType &e);
    25 Status StackTraverse(SqStack S);
    26 
    27 #endif
    //Stack.cpp
    
    #include"Stack.h"
    #include<iostream>
    #include<cstdlib>
    using namespace std;
    
    Status InitStack(SqStack &S)
    {
        S.base = (SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
        if (!S.base)
            exit(OVERFLOW);
        S.top = S.base;
        S.stacksize = STACK_INIT_SIZE;
        return OK;
    }
    Status DestoryStack(SqStack &S)
    {
        S.top = S.base;
        free(S.base);
        S.stacksize = 0;
        return OK;
    }
    Status ClearStack(SqStack &S)
    {
        S.top = S.base;
        return OK;
    }
    Status StackEmpty(SqStack &S)
    {
        if (S.top == S.base)
            return OK;
        return ERROR;
    }
    int StackLength(SqStack S)
    {
        return (S.top - S.base)/sizeof(SElemType);
    }
    Status GetTop(SqStack S, SElemType &e)
    {
        if (S.top == S.base)
            return ERROR;
        e = *(S.top - 1);
        return OK;
    }
    Status Push(SqStack &S, SElemType e)
    {
        if (S.top - S.base >= S.stacksize)//追加栈的存储空间
        {
            S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
            if (!S.base)
                exit(OVERFLOW);
            S.top = S.base + S.stacksize;
            S.stacksize += STACKINCREMENT;
        }
        *S.top++ = e;
        return OK;
    }
    Status Pop(SqStack &S, SElemType &e)
    {
        if (S.top == S.base)
            return ERROR;
        e = *--S.top;      //*S.top并没有指向元素,S.top指向栈顶元素的下一个位置
        return OK;
    }
    Status StackTraverse(SqStack S)
    {
        if (S.top == S.base)
        {
            cout << "栈为空"<<endl;
            return ERROR;
        }
        SElemType *p = S.base;
        cout << "栈底 |";
        for (p = S.base; p < S.top; p++)
            cout << *p<<" ";
        cout << endl;
        return OK;
    }
    //Main.cpp
    
    #include"Stack.h"
    #include<iostream>
    using namespace std;
    
    int main()
    {
        SqStack S;
    
        SElemType temp = 0;
        int choose = 10;
        
        while (choose != 0)
        {
            switch (choose)
            {
            case 1:
                InitStack(S);
                if(S.base)
                    cout << "构造栈成功" << endl;
                break;
            case 2:
                DestoryStack(S);
                cout << "销毁栈成功" << endl;
                break;
            case 3:
                ClearStack(S);
                cout << "清空栈成功" << endl;
                break;
            case 4:
                if (StackEmpty(S))
                    cout << "栈为空"<<endl;
                else
                    cout << "栈不为空"<<endl;
                break;
            case 5:
                cout<<StackLength(S);
                break;
            case 6:
                GetTop(S,temp);
                cout << "栈顶元素为:"<<temp<<endl;
                break;
            case 7:
                cout << "输入要插入的元素: ";
                cin >> temp;
                Push(S, temp);
                break;
            case 8:
                if (S.base == S.top)
                    cout << "栈已空,无法弹出元素" << endl;
                else
                {
                    Pop(S, temp);
                    cout <<"弹出 "<< temp<<endl;
                }
                break;
            case 9:
                StackTraverse(S);
                break;
            default:
                cout << "|**顺序栈**|" << endl;
                cout << "|1.构造栈 *|" << endl;
                cout << "|2.销毁栈 *|" << endl;
                cout << "|3.置空栈 *|" << endl;
                cout << "|4.栈空否 *|" << endl;
                cout << "|5.栈长度 *|" << endl;
                cout << "|6.栈顶值 *|" << endl;
                cout << "|7.插入栈 *|" << endl;
                cout << "|8.弹出栈 *|" << endl;
                cout << "|9.遍历栈 *|" << endl;
                cout << "|0.退出    |" << endl;
                break;
            }    
            cout << "input 0~9" << endl;
            cin >> choose;
        }
        system("pause");
        return 0;
    }
  • 相关阅读:
    理解css中min-width和max-width,width与它们之间的区别联系
    html实现时间轴_纯css实现响应式竖着/垂直时间抽布局效果
    web页面的重构和回流【转载】
    介绍web开发中实现会话跟踪的常用技术方法
    web标签语义化的理解_web语义化是什么意思
    从浏览器地址栏输入url到显示页面的步骤(以HTTP为例)
    H5调用手机的相机/摄像/录音等功能 _input:file的capture属性说明
    相邻元素之间的margin合并问题
    HTML连载33-背景定位
    Java连载22-for循环
  • 原文地址:https://www.cnblogs.com/sgawscd/p/10198746.html
Copyright © 2011-2022 走看看