栈(stack)的创建、PUSH压栈和POP弹栈

  1. :一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
  2. 压栈/入栈:栈的插入操作,入栈数据是在从栈顶入栈。
  3. 弹栈/出栈:栈的删除操作,出栈数据也是从栈顶出栈。

 

************主要功能都已经完成************

/*************************************************************************
*   file name:stack
*   function:  实现对栈的压栈出栈打印功能
*   date: 2025.5.16
*   note:none
*    Copyright (c) 2024-2025 l550036303@163.com All right reserved
**************************************************************************/
typedef int elementtype_t;


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

typedef struct stack {
    elementtype_t * Addr;      //表示栈的地址
    unsigned int size;         //表示栈的空间大小
    int front;                  //表示栈顶
}stack_t;                      //规范命名需要加 "_t"



bool stack_IsFull(stack_t * manager);
bool stack_movelist(stack_t *manager,int location);
/*************************************************************************
*   name:stack_creat
*   function:  实现对栈的创建
*   argument: 
*               @size 表示所创建的栈的空间大小
*   reval:返回指向栈的指针
*   date: 2025.5.16
*   note:none
**************************************************************************/
//创建栈
stack_t * stack_creat(unsigned int size){
    stack_t *manager = (stack_t *)calloc(1,sizeof(stack_t)); 
     //给stack分配空间失败的错误处理
    if(NULL == manager){
        perror("manager creat fault for stack creat");
        exit(-1);        
    }
    manager->Addr = (elementtype_t *)calloc(size,sizeof(elementtype_t));
     //给Addr分配空间失败的错误处理
    if(NULL == manager->Addr ){
        perror("manager creat fault for Addr creat");
        exit(-1);        
    }

    manager->size = size;

    manager->front = -1;

    return manager;
}

/*************************************************************************
*   name:stack_push
*   function:  在栈最后插入数据元素
*   argument: 
*               @manager 需要插入的目标栈
*               @element 要插入的数据
*   reval:
*                                true压栈成功   
*                                false压栈失败
*   date: 2025.5.17
*   note:none
**************************************************************************/
bool stack_push(stack_t * manager,elementtype_t element){
    if(stack_IsFull(manager)){
        printf("\tlist is full , add fail\n");
        return false;
    }
    // 把front向后+1 , 然后把element的值给所指的位置,实现插入
    manager->Addr[++manager->front] = element;
    printf("\tpush\tsuccess\n");
    return true;
}


/*************************************************************************
*   name:stack_IsFull
*   function:判断此栈是否已满,还有没有剩余空间
*   argument: 
*               @manager 需要判断的栈
*   reval: 以布尔类型返回结果       
*                               true 还有空间
*                               false没有空间了
*   date: 2025.5.17
*   note:none
**************************************************************************/
bool stack_IsFull(stack_t * manager){            //空间已满        还有空间
    return ((manager->front)+1 > manager->size) ?  true: false;
       
    }


/*************************************************************************
*   name:stack_Isempty
*   function:判断此栈是否为空,还有没有元素
*   argument: 
*               @manager 需要判断的栈
*   reval: 以布尔类型返回结果       
*                               true 还有空间
*                               false没有空间了
*   date: 2025.5.17
*   note:none
**************************************************************************/
bool stack_Isempty(stack_t * manager){            //空间已满        还有空间
    return ((manager->front) == -1) ?  true:  false;
    }    


/*************************************************************************
*   name:stack_print
*   function:打印该栈中的元素
*   argument: 
*               @manager 需要打印的栈
*   reval: 以布尔类型返回结果  
*                                true打印成功     
*                                false打印失败,出现问题
*   date: 2025.5.17
*   note:none
**************************************************************************/
bool stack_print( stack_t *manager ){
    if( NULL == manager ){
        printf("\tthis stack is undefined\n");
        return false;
    }
    if(stack_Isempty(manager)){
        printf("\tthis stack is empty\n");
        return false;
    }
    for( int i = 0;i <= manager->front ; i++ ){
        if( 0 == i ){
             printf(" This sequenlist :\n ");
        }
        printf(" \tnumber:%d\tvalue:%d \n ",i,(manager->Addr[i]));
    }
    return true;
}




/*************************************************************************
*   name:stack_pop
*   function:  在栈最后插入数据元素
*   argument: 
*               @manager 需要插入的目标栈
*               @element 要插入的数据
*   reval:
*                                true   弹栈成功     
*                                false  弹栈失败
*   date: 2025.5.17
*   note:返回值是elementtype_t类型,可以定义一个值来接受弹栈的元素,也可以直接打印该值
**************************************************************************/
elementtype_t stack_pop(stack_t * manager){
    int temp;
    if(stack_Isempty(manager)){
        printf("\tstack is NULL , pop fail\n");
        return false;
    }
    // 先把指向的值弹出,然后-1
    temp = manager->Addr[manager->front--];
    printf("\tpop\tsuccess\n");
    return temp;
}

int main(int agrc,char const *argv[]){

    stack_t * manager = stack_creat(10);
    stack_push(manager,100);
    stack_push(manager,200);
    stack_push(manager,300);
    stack_print(manager);
    int temp = 0;
    temp = stack_pop(manager);
    printf("\t%d\n",temp);
    printf("\t%d\n",stack_pop(manager));
    return 0;
}

 

 

posted @ 2025-05-17 16:22  记得要好好吃饭  阅读(143)  评论(0)    收藏  举报