zoukankan      html  css  js  c++  java
  • 栈与队列:栈的顺序储存结构

    1.栈的元素必须后进先出
    2.栈的操作只能在线性表的表尾进行
    3.对于栈,栈的表尾称为栈顶(top),相应的表头称为栈底(bottom)。
    栈的插入操作(push)叫进栈,也叫压栈,入栈。
    栈的删除操作(Pop),叫出栈,也叫弹栈。
    
    //栈基本操作
    //栈的顺序存储结构
    #define STACK_INIT_SIZE 100 
    
    typedef struct
    {
        ElemType *base; //base是指向栈底的指针变量 
        ElemType *top;  //top是指向栈顶的指针变量 
        int stackSize;  //stackSize指示栈的当前可使用的最大容量 
    }sqStack;
    //初始化 
    initStack(sqStack *s)
    {
        s->base = (ElemType *)malloc(STACK_INIT_SIZE*(ElemType));
        if(!s->base)
        exit(0);
        s->top = s->base; //最开始栈顶就是栈底 
        s->stackSize = STACK_INIT_SIZE;
    }
    
    //入栈 每次向栈中压入一个数据,top指针+1,直到栈满为止 
    #define SATCKINCREMENT 10 //增量 
    
    Push(sqStack *s,ElemType e)
    {
        //如果栈满,追加空间
        if(s->top - s->base >= s->stackSize)
        {
            s->base = realloc(s->base,(s->stackSize+SATCKINCREMENT)*sizeof(ElemType));//相当于扩容
            if(!s->base)
            exit(0);
            s->top = s->base+s->stackSize;     //设置栈顶 
            s->stackSize = s->stackSize + SATCKINCREMENT;//设置栈的最大容量 
        } 
        *(s->top) = e;
        s->top++; 
    }
    
    //出栈操作 
    //出栈操作就是在栈顶取出数据,栈顶指针随之下移的操作
    //每次弹出一个数据,栈的当前容量就-1
    Pop(sqStack *s, ElemType *e)
    {
        if(s->top == s->base) //栈已经是空空如也
        return;
        *e = *--(s->top); //top指针是栈顶 实质是没有数据的所一需要先自减才能取出数据 
    } 
    
    //清空一个栈 物理空间不会改变
    ClearStack(sqStack *s)
    {
        s->top = s->base;
    }
    //销毁栈 清除物理空间
    DestoryStack(sqStack *s)
    {
        int i,len;
        len = s->stackSize; //获取容量 
        for(i = 0; i < len; i++)
        {
            free(s->base);
            s->base++;
        }
        s->base = s->top = NULL;
        s->stackSize = 0;
    } 
    //计算栈的当前容量
    int Stacklen(sqStack s)
    {
        return(s.top - s.base);
    }
    
    //顺序栈的基本操作 (在下亲自编写)
    #include<stdio.h>
    #include<stdlib.h>
    
    #define OK 1
    #define OVERFLOW -1
    #define ERROR -1
    #define MAXSIZE 100
    
    typedef int ElemType;
    typedef int Status;   
    typedef int SElemType;   
    
    typedef struct 
    {
        SElemType *base; //栈底指针
        SElemType *top;  //栈顶指针
        int stacksize; 
    }SqStack;
    
    Status InitStack(SqStack *s);  //初始化 
    Status Push(SqStack *s,SElemType e);  //压栈 
    Status StackLen(SqStack s);  //测量 
    SElemType GetTop(SqStack s); //获取顶部元素
    Status Pop(SqStack *s,SElemType *e);  //出栈 
    
    Status InitStack(SqStack *s)
    {
        s->base = (SElemType *)malloc(MAXSIZE*sizeof(SElemType));
        if(!s->base)  //储存分配失败 
        {
            exit(OVERFLOW);
        }
        s->top = s->base; //空栈
        s->stacksize = MAXSIZE;
        return OK;
    }
    
    Status Push(SqStack *s,SElemType e)
    {
        if(s->top - s->base >= s->stacksize)
        return ERROR;
        *(s->top)++ = e;//压入栈顶 栈顶指针加1 
        return OK;
    }
    
    Status StackLen(SqStack s)//测量 
    {
        return (s.top - s.base);
    }
    
    Status Pop(SqStack *s,SElemType *e)
    {
        if(s->top == s->base)
        {
            return ERROR;
        }
        *e = *--(s->top);
        return OK;
    }
    
    SElemType GetTop(SqStack s)
    {
        if(s.top != s.base)   //栈为非空 
        return *(s.top-1);
    }
    
    int main(void)
    {
        SqStack s;
        SElemType e;
        ElemType len;
        ElemType i; 
        SElemType data;
        
        InitStack(&s); //栈的初始化 
         
        printf("请输入数据,以0结束!\n"); 
        while(1)       //入栈 
        {
            scanf("%d",&e);
            if(e == 0)
            break;
            Push(&s,e);  
        }
        
        len = StackLen(s);//测量 
        printf("栈的长度为:%d",len); 
        printf("\n\n");
        
        data = GetTop(s);
        printf("栈顶的元素为:%d",data);
        printf("\n\n");
        
        printf("栈中的数据为:\n");
        for(i=0; i < len; i++)
        {
            Pop(&s,&e);    //出栈 
            printf("%4d",e);
        }
    
        return 0;
    }
  • 相关阅读:
    (转)DirectInput编程基础
    怎么样解决3D 地形、天空盒等网格模型出现缝隙的问题
    D3DLIGHT9光源
    D3DXCreateTextureFromFileEx
    CreateVertexBuffer和CreateIndexBuffer
    D3D中材质通过D3DMATERIAL9结构说明
    IDirect3DVertexBuffer9::Lock和IDirect3DIndexBuffer9::Lock
    D3DPRESENT_PARAMETERS_结构(D3D初始化)(
    Windows Phone开发(6):处理屏幕方向的改变
    Windows Phone开发(4):框架和页
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12491245.html
Copyright © 2011-2022 走看看