#ifndef _STACK_
#define _STACK_
#include <stdio.h>
#include <stdlib.h>
typedef int data_t;
typedef struct stack
{
data_t *data;
int maxlen;
int top;
}Stack;
Stack* Stack_create(int lenth);
int Stack_empty(Stack *stack);
int Stack_full(Stack *stack);
void Stack_push(Stack *stack,data_t new_data);
data_t Stack_pop(Stack *stack);
data_t Stack_gettop(Stack *stack);
void Stack_delete_pos(Stack *stack,int pos);
void Stack_delete_data(Stack *stack,data_t data);
void Stack_change_data(Stack *stack,data_t data,data_t new_data);
void Stack_clear(Stack *stack);
void Stack_destroy(Stack **stack);
void Stack_show(Stack *stack);
#endif
/*头文件,函数声明,全局变量定义*/
Stack *Stack_create(int lenth) //栈的创建,成功创建返回一个结构体指针
{
Stack *stack = (Stack *)malloc(sizeof(Stack));
stack->data = (data_t *)malloc(sizeof(data_t)*lenth);
stack->top = -1;
stack->maxlen = lenth;
return stack;
}
int Stack_empty(Stack *stack) //判断是否为空栈,空栈返回-1,非空返回0
{
if(stack->top == -1)
{
printf("empty stack\n");
return -1;
}
else
return 0;
}
int Stack_full(Stack *stack) //判断是否为满栈,满栈返回-1,不满返回0
{
if(stack->top == (stack->maxlen)-1)
{
printf("full stack\n");
return -1;
}
else
return 0;
}
void Stack_push(Stack *stack,data_t new_data) //单元素入栈
{
if(Stack_full(stack) == -1)
return;
else
{
stack->top++;
stack->data[stack->top] = new_data;
}
return;
}
data_t Stack_pop(Stack *stack) //单元素出栈
{
if(Stack_empty(stack) == -1)
return -1;
stack->top--;
return stack->data[(stack->top)+1];
}
data_t Stack_gettop(Stack *stack) //取栈顶元素
{
if(Stack_empty(stack) == -1)
return -1;
return stack->data[stack->top];
}
void Stack_delete_pos(Stack *stack,int pos) //按位置删除栈中元素(下标)
{
if(pos<0 || pos > stack->top)
{
printf("error post\n");
return;
}
for(int i=pos+1;i <= stack->top;i++)
{
stack->data[i-1] = stack->data[i];
}
stack->top--;
return;
}
void Stack_delete_data(Stack *stack,data_t data) //删除栈中指定数据
{
if(Stack_empty(stack) == -1)
return;
int i = 0;
for(i=0;i <= stack->top;i++)
{
if(stack->data[i]==data)
{
Stack_delete_pos(stack,i); //相当于找到该元素位置再按位置删除
return;
}
}
if(i > stack->top)
{
printf("no this data\n");
}
return;
}
void Stack_change_data(Stack *stack,data_t data,data_t new_data)//更改栈中指定数据
{
if(Stack_empty(stack) == -1)
return;
int i = 0;
for(i=0;i <= stack->top;i++)
{
if(stack->data[i]==data)
{
stack->data[i]=new_data;
return;
}
}
if(i > stack->top)
{
printf("no this data\n");
}
return;
}
void Stack_clear(Stack *stack) //清空一个栈
{
stack->top = -1;
return;
}
void Stack_destroy(Stack **stack) //销毁一个栈,释放内存
{
free((*stack)->data);
(*stack)->data = NULL;
free(*stack);
*stack = NULL;
return;
}
void Stack_show(Stack *stack) //依次打印栈中各元素
{
for(int i=0;i <= stack->top;i++)
{
printf("%d ",stack->data[i]);
}
puts("");
return;
}
178



被折叠的 条评论
为什么被折叠?



