Play Open
Loading Please wait Loading Please wait Loading Please wait Loading Please wait Loading Please wait Loading Please wait

栈(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

#include

#include

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;

}

Copyright © 2088 足球小将世界杯_1999年美国女足世界杯 - omaili.com All Rights Reserved.
友情链接