一、基本概念
特点:先进后出,栈的逻辑结构是线性的
二、顺序栈
基于顺序表实现的一种栈的结构,通过操作栈顶的指针来实现入栈和出栈的操作
1.栈的结构体创建
#define MAX 5
typedef struct STACK{
int arr[MAX];
int top;
}stack_t;
2.栈的初始化
stack_t *my_stack =NULL;
create_stack(&my_stack);
创建栈的函数
int create_stack(stack_t **p)
{
*p=(stack_t *)malloc(sizeof(stack_t));
if(*pNULL){
printf(“create error!\n”);
return -1;
}//对指针p做非空检查,检查是否分配成功
(*p)->top=0;
return 0;//将栈顶的指针置0;
}
3.判断栈是否为满 栈满返回0,没满返回1;
int is_full(stack_t *my_stack){
if(my_stack NULL)
{
printf(“栈为空\n”);
return -1;//对传入的参数进行非空检查
}
if(my_stack->topMAX){
return 0;
}
retrurn 1;
}
4.判断栈是否为空,返回1表示没空,0表示空
int is_empty(stack_t *my_stack){
if(my_stackNULL)
{
printf(“入参为空\n”);
return -1;
}
if(my_stack->top0)
{
return 0;
}
return 1;
}
5.入栈操作
int push_stack(stack_t *my_stack,int data)
{
if(my_stackNULL)
{
printf(“push filed\n”);
return -1;
}
if(is_full(my_stack)0)
{
printf(“栈满,入栈失败\n”);
return -1;
}
my_stack->arr[my_stack->top]=data;
my_stack->top++;
return 0;
}
6.出栈操作
int pop_stack(stack_t *my,int *num)
{
if(my_stackNULL||numNULL)
{
printf(“入参为空,出栈失败\n”);
return -1;
}
if(is_empty(my_stack))
{
printf(“栈空,出栈失败\n”);
return -1;
}
my_stack->top–;
*num=my_stack->arr[my_stack->top];
return 0;
}
7.清空栈
int clean_stack(stack_t *my_stack)
{
if(my_stackNULL)
{
printf(“清空失败,入参为空\n”);
}
my_stack->top=0;
return 0;
}
8.销毁栈
int free_stack(stack_t **my_stack)
{
if(*my_stackNULL||**my_stackNULL)
{
printf(“入参为空,销毁失败\n”);
return -1;
}
free(*my_stack);
*my_stack==NULL;
return 0;
}
三,使用栈实现十进制转换二进制
int main(int argc, char *argv[]){
if(argc != 2){
printf("Usage : %s 十进制数\n", argv[0]);
exit(-1);
}
int num = atoi(argv[1]);//输入的十进制数
int ys = 0;//保存余数的
//余数入栈
while(num != 0){
ys = num % 2;
push_stack(my_stack, ys);
num /= 2;
}
//余数出栈
int value = -1;
while(1){
if(-1 == pop_stack(my_stack, &value)){
break;
}
printf("%d", value);
}
putchar(10);
return 0;
}