数据结构之栈

一、基本概念
特点:先进后出,栈的逻辑结构是线性的
二、顺序栈
基于顺序表实现的一种栈的结构,通过操作栈顶的指针来实现入栈和出栈的操作
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->top
MAX){
return 0;
}
retrurn 1;
}
4.判断栈是否为空,返回1表示没空,0表示空
int is_empty(stack_t *my_stack){
if(my_stack
NULL)
{
printf(“入参为空\n”);
return -1;
}
if(my_stack->top0)
{
return 0;
}
return 1;
}
5.入栈操作
int push_stack(stack_t *my_stack,int data)
{
if(my_stack
NULL)
{
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_stack
NULL||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_stack
NULL)
{
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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值