数据结构栈的顺序存储(c语言描述)

  考研之路又挺近了一步,今天主要我自己写了一下栈的顺序存储,栈是一个后进先出的线性表,它只允许在表尾进行插入和删除,其实还是属于线性表的范畴,只要我们把线性表的一些相关操作搞清楚了,栈就很容易搞清楚了,首先我们要搞清楚栈顶其实就是表尾,而栈底是表头,下面来展示代码吧:

1.声明结构体

#define MAXSIZE 10  //容量 
#define INSERTSIZE 5 //增加容量 
typedef int ElemType;
typedef struct{
    ElemType *top;  //指向栈顶的指针 
    ElemType *base;  //指向栈底的指针 
    int stackLength;  //栈的容量 
}stack,*link;

2.栈的初始化

void initStack(stack *s)  //这里使用  stack *s  和 link s效果一模一样 
{
    s->base=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
    if(!s->base)
    {
        printf("空间申请失败\n");
    }
    s->top=s->base; //一开始栈顶和栈底在同一位置
    s->stackLength=MAXSIZE;  //栈的最大容量 
} 

3.入栈操作

里面realloc其实是malloc的封装函数,重新申请空间的意思,可以将之前空间的数据赋值过去

void push(stack *s,int e)
{
    if((s->top-s->base)==s->stackLength)  //栈的空间满了 
    {
        s->base=(ElemType*)realloc(s->base,(s->stackLength+INSERTSIZE)*sizeof(ElemType));  //重新分配空间
        s->top=s->base+s->stackLength;  //分配栈顶的位置
        s->stackLength+=INSERTSIZE;   //设置最大容量 
    }
    *(s->top)=e; //给空间数值赋值
    s->top++; 
}

4.出栈操作

ElemType pop(stack *s,int *e)//这里要用引用,传回数值
{
    if(s->top==s->base)  //如果栈为空 
    {
        printf("栈为空,无法出栈\n");
        return -1;
    }
    else
    {
        *e=*(--s->top);  //先将栈顶向下移一位再取出数据 
        return *e;
    }
} 

5.清空操作

void clearStack(stack *s)
{
    s->top=s->base;
}

6.销毁栈的操作

//销毁栈
void destroyStack(stack *s)
{
    int length,i;
    length=s->top-s->base; //栈的容量
    for(i=0;i<length;i++)
    {
        free(s->base); //释放栈底空间 
        s->base++;
    } 
    s->top=s->base=NULL;
    s->stackLength=0;
} 

所有的代码如下:

#include<stdlib.h>
#include<stdio.h>

#define MAXSIZE 10  //容量 
#define INSERTSIZE 5 //增加容量 
typedef int ElemType;
typedef struct{
    ElemType *top;  //指向栈顶的指针 
    ElemType *base;  //指向栈底的指针 
    int stackLength;  //栈的容量 
}stack,*link;


//栈的初始化
void initStack(stack *s)  //这里使用  stack *s  和 link s效果一模一样 
{
    s->base=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
    if(!s->base)
    {
        printf("空间申请失败\n");
    }
    s->top=s->base; //一开始栈顶和栈底在同一位置
    s->stackLength=MAXSIZE;  //栈的最大容量 
} 

//入栈
void push(stack *s,int e)
{
    if((s->top-s->base)==s->stackLength)  //栈的空间满了 
    {
        s->base=(ElemType*)realloc(s->base,(s->stackLength+INSERTSIZE)*sizeof(ElemType));  //重新分配空间
        s->top=s->base+s->stackLength;  //分配栈顶的位置
        s->stackLength+=INSERTSIZE;   //设置最大容量 
    }
    *(s->top)=e; //给空间数值赋值
    s->top++; 
}

//出栈
ElemType pop(stack *s,int *e)//这里要用引用,传回数值
{
    if(s->top==s->base)  //如果栈为空 
    {
        printf("栈为空,无法出栈\n");
        return -1;
    }
    else
    {
        *e=*(--s->top);  //先将栈顶向下移一位再取出数据 
        return *e;
    }
} 

//清空 
void clearStack(stack *s)
{
    s->top=s->base;
}


//销毁栈
void destroyStack(stack *s)
{
    int length,i;
    length=s->top-s->base; //栈的容量
    for(i=0;i<length;i++)
    {
        free(s->base); //释放栈底空间 
        s->base++;
    } 
    s->top=s->base=NULL;
    s->stackLength=0;
} 

int main()
{
    stack s;
    initStack(&s);//栈的初始化
    
    printf("结束操作-------0\n");
    printf("入栈操作-------1\n");
    printf("出栈操作-------2\n");
    printf("清空栈的操作-------3\n");
    printf("销毁栈的操作-------4\n");
     
    int number,e; //指令 ,数据 
    printf("请输入指令");
    scanf("%d",&number);
    
    while(number!=0)
    {
        switch(number)
        {
            case 1:         //入栈操作    
                printf("入栈的数值为:");
                scanf("%d",&e);
                push(&s,e);
                break;
            
            case 2:         //出栈操作 
                e=pop(&s,&e);
                printf("出栈的元素值为:%d\n",e);
                break;
            
            case 3:       //清空栈的操作
                clearStack(&s);
                break;
            
            case 4:        //销毁栈的操作
                destroyStack(&s);
                printf("栈已销毁\n");
                break;
                
            default:
                printf("你输入的指令不正确\n");   
        }
        printf("你的下一步指令为:");
        scanf("%d",&number);
    }
    return 0;
}

  今天就这样了,如果大家有什么建议欢迎提出来。

猜你喜欢

转载自www.cnblogs.com/qian-yi/p/12721713.html