#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <math.h>
#define STACK_INIT_SIZE 10
#define STACK_SIZE_ADD 10
typedef char ElemType;
typedef struct{
ElemType *top; //栈顶指针
ElemType *base; //栈底指针
int MaxSize; //最大长度
}stack;
void init_stack(stack *s){
//分配初始内存大小
s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
//判断内存是否分配成功
if( !s->base ){
printf("内存分配失败\n");
return;
}
//初始化栈顶和栈底指向相同
s->top = s->base;
//初始化栈的最大大小
s->MaxSize = STACK_INIT_SIZE;
}
void push_stack(stack *s,ElemType value){
//判断栈是否超过了最大长度
if(s->top - s->base >= s->MaxSize){
//relloc 重新分配内存,有两个参数,分别是指向地址的指针和内存大小
s->base = (ElemType *)realloc(s->base,(s->MaxSize + STACK_SIZE_ADD) * sizeof(ElemType));
if(!s->base){
printf("内存分配失败\n");
return;
}
}
*(s->top) = value;
//top指针向上移动,指向下一个元素,此时还没有内容
s->top++;
}
ElemType pop_stack(stack *s){
//判断是否为空栈
if(s->top == s->base){
printf("该栈为空!\n");
return -1;
}
return *--(s->top);
}
void Print_stack(stack s){
//判断是否为空栈
if(s.top == s.base){
printf("该栈为空!\n");
return;
}
ElemType *p = s.base;
printf("栈中的元素为:\n");
while(p < s.top){
printf("%d ",*p);
p++;
}
printf("\n");
}
void clear_stack(stack *s){
ElemType *p = s->base;
if(s->top == s->base){
printf("该栈为空!\n");
return;
}
for( ; p != s->top; p++){
*p = 0;
}
}
void destroy_stack(stack *s){
if(s->base != NULL){
free(s->base);
s->top = NULL;
s->base = NULL;
s->MaxSize = 0;
printf("该栈销毁成功\n");
return;
}
printf("该栈为空,无法进一步销毁\n");
}
int main(){
stack myStack;
init_stack(&myStack);
push_stack(&myStack,1);
push_stack(&myStack,2);
push_stack(&myStack,3);
Print_stack(myStack);
printf("删除的元素是: %d\n",pop_stack(&myStack));
Print_stack(myStack);
clear_stack(&myStack);
Print_stack(myStack);
destroy_stack(&myStack);
destroy_stack(&myStack);
return 0;
}
栈的基本操作.C
最新推荐文章于 2024-07-25 13:54:27 发布