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

************主要功能都已经完成************
/*************************************************************************
* 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;
}

浙公网安备 33010602011771号