顺序栈

来源:互联网 发布:ubuntu阻塞脚本自启动 编辑:程序博客网 时间:2024/06/10 00:33

栈可以看做受限的顺序表,它的插入与删除只能在表尾进行,将表尾称为栈顶,表头称为栈底。不含元素的空表称为空栈。根据栈的定义可以知道栈的修改遵循后进先出的原则。

下面给出顺序栈的相关操作:

#include<stdio.h>#include<malloc.h>typedef int ElemType;#define INIT_SIZE 10#define INC_SIZE 5typedef struct SeqStack    //栈的结构体定义{    ElemType *base;    ElemType top;    ElemType size;}SeqStack;void InitStack(SeqStack *s)   //初始化{    s->base = (ElemType *)malloc(sizeof(ElemType));    s->top = 0;                //栈顶指向0    s->size = INIT_SIZE;}int IsEmpty(SeqStack s)   //判断栈是否为空{    return s.top = 0 ? 1 : 0;    //将栈顶的值返回  若为0则表示为空栈 }int IsFull(SeqStack s)    //判断是否为满栈{    return s.top>s.size ? 1 : 0;  //依旧将栈顶的值返回  若大于栈的容量size 则表示栈已经满了}void Show(SeqStack s)          //显示函数  将栈内的元素显示出来{    int i;    for(i=s.top-1; i>0; i--)    //利用循环 从栈顶元素开始依次输出打印        printf("%d ", s.base[i]);    printf("\n");}int Inc(SeqStack *s)                //增加空间  当输入元素个数超过栈初始化时的容量是需要增加栈的空间{    int newsize = s->size + INC_SIZE;   //定义新的空间  它的大小等于原来栈的大小加上要开辟的空间大小    s->base = (ElemType*)realloc(s->base, sizeof(ElemType)*newsize);   //利用realloc()函数动态开辟空间  在原来的空间里开辟sizeof大小的空间    if(s->base == NULL)        return 0;    else    {        s->size = newsize;   //修改栈的大小        return 1;    }}void Push(SeqStack *s, ElemType x)   //压栈操作 {    if(IsFull(*s) && Inc(s))        {        printf("栈已满且增加空间失败,不能进行进栈操作!\n");        return;    }    s->base[s->top] = x; //将要压入的数据赋给栈顶所指的空间    s->top++;            //top上移}void Pop(SeqStack *s)    //出栈操作{    if(IsEmpty(*s))    {        printf("栈已空,无法进行出栈操作!\n");        return;    }    s->top--;    //将栈顶下移}int Length(SeqStack s)  //求栈的长度{    return s.top-1;     //返回栈顶的位置   由于栈的初始化里将栈顶置为0  所以在每次压栈操作结束后栈顶都会向上移动  故top在最后元素的上面}                       //所以 将top-1就能得到栈的长度void Clear(SeqStack *s)  //清除操作{    s->top = 0;     //将top置零}void Destroy(SeqStack *s)  //销毁{    if(s->base != NULL)    {        free(s->base);     //释放栈空间并置空        s->base = NULL;    }    s->top = 0;        //栈顶top置零  大小置零    s->size = 0;}int GetTop(SeqStack *s, ElemType *x)    //获取栈顶元素{    if(IsEmpty(*s)) return 0;         *x = s->base[s->top-1];            return 1;}
0 0
原创粉丝点击