数据结构:顺序栈

栈是一种先进后出的数据结构,只允许在一端(栈顶)操作,代码中top表示栈顶。

stack.h

/*===============================================
*   文件名称:stack.h
*   创 建 者:cxy     
*   创建日期:2024年01月17日
*   描    述:
================================================*/
#ifndef _STACK_H
#define _STACK_H

#include 
#include 

typedef struct stack{
    int *arr; //malloc开辟空间
    int len;  //开辟空间大小
    int top;  //栈顶,栈只能从一端操作(栈顶)
}Stack,*Pstack;

int init(Pstack *P,int len);   //创建栈
int push_stack(Pstack p,int data);  //入栈
int pop_stack(Pstack p,int *data);  //出栈,只能从栈顶依次出栈
int empty_stack(Pstack p);  //栈空,1为空
int full_stack(Pstack p);  //栈满,1为满
int sum_stack(Pstack p);   //栈内元素个数


#endif

stack.c

/*===============================================
*   文件名称:stack.c
*   创 建 者:cxy     
*   创建日期:2024年01月17日
*   描    述:
================================================*/
#include "stack.h"

int init(Pstack *P,int len)
{
    *P = malloc(sizeof(Stack));  //结构体
    if(NULL == (*P))
    {
        perror("init err:*P");
        return -1;
    }
    (*P)->arr = malloc(sizeof(int)*len);  //数组
    if(NULL == (*P)->arr)
    {
        perror("init err:(*P)->arr");
        free(*P);
        return -1;
    }
    
    (*P)->len = len;
    (*P)->top = -1;   //将栈顶作为下标始用

    return 0;
}

int push_stack(Pstack p,int data)
{
    if(NULL == p)
    {
        perror("push err:p");
        return -1;
    }
    if(full_stack(p))
    {
        perror("push err:full");
        return -1;
    }
    
    p->arr[++(p->top)] = data;
    
    return 0;
}

//int *data为出栈元素,通过地址传递改变实际参数
//该函数返回值只作为判断
int pop_stack(Pstack p,int *data)
{
    if(NULL == p)
    {
        perror("pop err:p");
        return -1;
    }
    if(empty_stack(p))
    {
        perror("pop err:empty");
        return -1;
    }

    *data = p->arr[(p->top)--];
    
    return 0;
}

int empty_stack(Pstack p)
{
    if(NULL == p)
    {
        perror("empty err:p");
        return -1;
    }
    if(p->top == -1)
        return 1;
    else 
        return 0;
}
int full_stack(Pstack p)
{
    if(NULL == p)
    {
        perror("full err:p");
        return -1;
    }
    if((p->len)-1 == p->top)  //如len = 100,arr[100],top为下标最大为99
        return 1;
    else 
        return 0;
}

int sum_stack(Pstack p)
{
    if(NULL == p)
    {
        perror("sum err:p");
        return -1;
    }

    return p->top+1;   //下标加1
}

mian.c

/*===============================================
*   文件名称:main.c
*   创 建 者:cxy     
*   创建日期:2024年01月17日
*   描    述:
================================================*/
#include "stack.h"

int main(int argc, char *argv[])
{ 
    Pstack p;
    int data;
    printf("请输入开辟空间元素个数:\n");
    scanf("%d",&data);

    init(&p,data);
    
    printf("**********empty_stack,1为空**********\n");
    data = empty_stack(p);
    printf("%d\n",data);

    printf("**********push_stack**********\n");
    for(int i = 1;i < 6;i++)
    {
        printf("请输入第%i个入栈元素:",i);
        scanf("%d",&data);
        push_stack(p,data);
    }

    printf("**********full_stack,1为满**********\n");
    data = full_stack(p);
    printf("%d\n",data);
    
    printf("**********empty_stack,1为空**********\n");
    data = empty_stack(p);
    printf("%d\n",data);

    printf("**********sum_stack**********\n");
    data = sum_stack(p);
    printf("栈内共有%d个有效数据\n",data);
   
    printf("**********pop_stack**********\n");  //先进后出
    for(int i = 1;i < 6;i++)
    {
        pop_stack(p,&data);
        printf("第%i个出栈元素:%d\n",i,data);
    }

    printf("**********empty_stack,1为空**********\n");
    data = empty_stack(p);
    printf("%d\n",data);

    printf("**********full_stack,1为满**********\n");
    data = full_stack(p);
    printf("%d\n",data);

    printf("**********sum_stack**********\n");
    data = sum_stack(p);
    printf("栈内共有%d个有效数据\n",data);
    

    return 0;
} 

结果

数据结构:顺序栈_第1张图片

你可能感兴趣的:(数据结构,算法)