栈与队列:栈的顺序储存结构

随声附和 提交于 2020-03-14 12:39:20
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;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!