• c_数据结构_栈的实现


    #include<stdio.h>
    #include<stdlib.h>
    #define STACK_INIT_SIZE 100
    #define STACKINCREMENT 10  //stackincrement
    #define OVERFLOW -2
    #define OK 1
    #define ERROR 0
    typedef struct{
        int *base;
        int *top;
        int stacksize;
    
    }SqStack;
    
    //构建空栈
    int InitStack(SqStack &S){
        S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
        if(!S.base)exit(OVERFLOW);
        S.top=S.base;      //构建空栈
        S.stacksize=STACK_INIT_SIZE;
        printf("
    空栈创建成功!!
    
    ");
        return OK;
    }
    
    //插入元素为栈顶元素
        
    int Push(SqStack &S,int e){
        //插入数据为依次插入
        printf("
    请输入插入的数据:");
        scanf("%d",&e);
        if(S.top-S.base>S.stacksize){
            S.base=(int *)realloc(S.base,S.stacksize+STACKINCREMENT*sizeof(int));//栈满 ,加空间
            if(!S.base)exit(OVERFLOW);
            S.top=S.base+S.stacksize;
            S.stacksize+=STACKINCREMENT;
        }
        *S.top++=e;//存入数据
        printf("
    数据插入成功!!");
        return OK;
    }
    //删除栈顶元素
    int Pop(SqStack &S,int &e){
        //删除元素为最后一个数
        if(S.top==S.base){
            printf("
    栈为空!!无法继续删除!!");
            return ERROR;
        }
        e=*--S.top;
        printf("
    删除的元素为:%d",e);
        printf("
    
    删除成功!!");
        return OK;
    }
    // 判断是否为空栈
    int StackEmpty(SqStack S){
        if(S.top==S.base) return OK;
        else return ERROR;
    
    }
    
    //获取栈顶元素
    int GetTop(SqStack S,int &e){
        if(S.top==S.base) {
            printf("栈为空!!");
            return ERROR;
        }
        e=*(S.top-1);
        printf("
    存储的栈顶元素为:%d",e);
        return OK;
    }
    
    //查找元素
    /*
    int GetElem_Sk(SqStack &S,int i,int &e){
        printf("请输入查找元素的位置:");
        scanf("%d",&i);
    
        if(i<1||i>(S.top-S.base)){
            printf("元素不在栈空间内!!");
            return ERROR;
        }
        e=*(S.base++);
        printf("查找的元素为:%d",e);
        return OK;
    }
    */
    //创建栈,并可存入数据
    int creatlist(SqStack &S){
        int i,n;
        printf("请用户存入数据
    
    请选择存入数据个数:");
        scanf("%d",&n);
        while(n<=0){
            printf("
    存入个数小于了“1”,请重新存入:");
            scanf("%d",&n);
        }
    /*    if(n>(S.top-S.base)){
            printf("-----------");
            S.base=(int *)realloc(S.base,S.stacksize+STACKINCREMENT*sizeof(int));
            if(!S.base)exit(OVERFLOW);
            S.top=S.base+S.stacksize;
            S.stacksize+=STACKINCREMENT;
        }*/
        printf("
    请输入%d个数据:
    
    ",n);
    
        for(i=1;i<=n;i++){
            printf("请输入第%d个元素(请回车结束):",i);
            ++S.top;
            scanf("%d",S.top-1);
        }    
        printf("
    存入数据成功!!
    ");
        return OK;
    }
    
    //清空栈
    int clear(SqStack &S){
        S.top=S.base;
        printf("栈清空成功!!
    ");
    //    creatlist(S);
        return OK;
    }
    //打印栈中元素
    int pr(SqStack S){
        if(S.top==S.base){
            printf("
    
    栈为空!!");
            return ERROR;
        }
        int *p;
        p = S.top;
        printf("栈中元素有:
    ");
        while(p>S.base)    {
            p--;
            printf("
    %d",*p);
        }
        return OK;
    }
     //操作菜单
    void OperateMenu(){      
    
        printf("
    
    --------------请选择元素处理方式---------
    
    ");
        printf("注:此程序为栈的实现,故只能对序列尾进行元素的插入和删除
    
    ");
        printf("0> 退出
    
    ");
        printf("1>: 栈尾插入元素
    
    ");
        printf("2>: 删除栈尾元素
    
    ");
        printf("3>: 打印元素
    
    ");
        printf("4>: 获取栈顶元素(存入的最后一个元素)
    
    ");
        printf("5>: 清空原栈
    
    ");
        printf("6>:批量输入
    
    ");
        printf("请选择对元素的处理:");
    }
    void main(){
        int w=0,k,boo=1,e=0;
        SqStack S;
        printf("注:此测试过程输入值应全为数字
    
    ");
        printf("请用户选择创建栈或退出程序:
    
    ");
        printf("创建栈请输入:'1'
    
    ");
        printf("退出请选择'0'或 其它!!
    
    ");
        printf("请选择:");
        scanf("%d",&w);
        if(w==1){
            InitStack(S);    
    //      creatlist(S);
            OperateMenu();
            scanf("%d",&k);
            while(k){
                switch(k){
                    case 0:break;
                    case 1:Push(S,e);
                        break;    
                    case 2:Pop(S,e);
                        break;
                    case 3:boo=pr(S);
                        if(boo)
                            printf("
    
    打印成功!!");
                        else
                            printf("打印失败!!");
                        break;
                    case 4:boo=GetTop(S,e);
                        if(boo)
                            printf("
    
    获取成功!!");
                        else
                            printf("获取失败!!");
                        break;
                    case 5:clear(S);
                        break;
                    case 6:creatlist(S);break;
    
                }
                OperateMenu();
                scanf("%d",&k);
            }
        
        }
    
    }
  • 相关阅读:
    MINIBASE源代码阅读笔记之heapfile
    MINIBASE源代码阅读笔记之HFPage
    naive cube implementation in python
    C++中对已分配空间的指针调用一个类的构造函数
    作死自救日记——不小心修改linux下/etc/sudoers权限的解决办法
    TPC-H数据导入MySQL教程
    TeX Live & TeXstudio 安装手记
    Web开发入门知识小总结
    配置静态服务器和配置nfs
    数论们
  • 原文地址:https://www.cnblogs.com/Vera-y/p/9971239.html
Copyright © 2020-2023  润新知