栈的基本操作

栈是一种基于先进后出原则的数据结构,分为顺序栈和链栈。顺序栈使用数组实现,而链栈使用链表。文章介绍了栈的初始化、入栈、出栈操作,以及顺序栈和链栈的具体实现细节。
摘要由CSDN通过智能技术生成

栈的概念:栈是一种先进后出的数据结构

栈分成了栈顶和栈底(在栈顶进行元素的插入和删除操作)

栈中进入数据成为--入栈 push

栈中弹出数据称为--出栈 pop

栈的存储

 栈的存储方式有两种:顺序栈和链栈,即栈的顺序存储和链式存储。

栈的顺序存储(使用数组)

栈顶结构体
typedef struct Stack{
    
    int data[MAX];                //数据域
    int size;                    //栈的大小  栈中元素个数
    
}Stack,*SeqStack;
站的初始化
SeqStack create(){
    //创建栈  相当于动态开辟一个数组出来
    SeqStack p=(stack *)malloc(sizeof(Stack));
    if(p==NULL){
        return NULL;
    }
    
    //初始化栈的大小
    p->size=0;
    
    //初始化栈中的元素
    for(int i=0;i<MAX;i++){
        p->data[i]=0;
    }
    return p;
};
入栈
void push(SeqStack stack,int data){
    if(stack==NULL){
        return 0;
    }
    
    //入栈需要判断栈是否已满
    if(stack->size==MAX){
        printf("栈满!\n");
        return 0;
    }
    //stack->size   栈的大小  就是我们插入的元素下一个位置
    stack->data[stack->size]=data;
    
    //改变栈的大小
    stack->size++;
    
}

入栈需要注意 栈是否 不存在, 栈是否 已满

出栈
int pop(SeqStack stack){
    if(stack==NULL){
        return 0;
    }
    if(stack->size==0){
        printf("栈已空");
        return 0;
    }
    
    //删除一个元素
    stack->data[stack->size-1]=0;
    
    //改变栈的大小
    stack->size--;
    
}

出栈 需要注意 栈是否 不存在, 和栈是否 已空

遍历栈中元素
int foreachStack(SeqStack stack){
    if(stack==NULL){
        return 0;
    }
    
    for(int i=0;i<stack->size;i++){
        printf("%d  ",stack->data[i]);
    }
    
}
栈的链式存储

栈的链式存储结构体
//结点结构体
typedef struct Node {
    int data;
    struct Node *next;
}Node;

//栈的结构体
typedef struct Stack{
    struct Node header;        //头结点
    int size;                   //栈的大小及元素个数
}Stack,*LinkStack;
栈的初始化
LinkStack init_LinkStack(){
    //myStack 是指针,指向申请的空间
    LinkStack myStack=(Stack *)malloc(sizeof(Stack));
    
    if(myStack==NULL){
        return NULL;
    }
    
    //初始化长度为0
    myStack->size=0;
    
    //相当于初始化链表的头结点指针域
    myStack->header.next=NULL;
    
    
}
入栈
int push(LinkStack stack,int data){
    if(stack==NULL){
        return 0;
    }
    //创建一个结点
    Node *p=(Node *)malloc(sizeof(Node));
    
    //给结点数据域赋值
    p->data=data;
    
    //头插法 先连后边
    p->next=stack->header.next;
    
    stack->header.next=p;
    
    //改变栈的个数
    stack->size++;
    
}
出栈
int pop(LinkStack stack){
    //判断栈存不存在
    if(stack==NULL){
        return 0;
    }
    
    //判断栈空
    if(stack->size==0){
        printf("栈中无元素");
        return 0;
    }
    
    //定义一个 结点类型指针 用作 删除 结点
    Node *p=stack->header.next;
    
    //头结点 连接到删除结点后边
    stack->header.next=p->next;
    
    //释放结点
    free(p);
    
    //更新栈的大小
    stack->size--;
    
}
栈的销毁
void destroy_LinkStack(LinkStack stack)
{
    if (stack != NULL)
    {
        struct Node * pCur = stack->header.next;

        while (pCur != NULL)
        {
            //先保存住下一个节点的位置
            struct Node * pNext = pCur->next;

            //释放节点
            free(pCur);
            pCur = pNext;
        }

        free(stack);
        stack = NULL;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值