数据结构小练习--栈(上)

本文介绍了在C语言基础上,对数据结构中的顺序栈进行的练习,包括顺序栈的数据类型定义、初始化、入栈、出栈功能的实现,并提供了测试代码示例。作者S学长专注于C/C++及嵌入式领域,分享了相关代码和Makefile,以及使用栈进行数据进制转换的练习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构

本系列是C语言学完的基础上,对数据结构的一些练习,代码偏多。
注意啦:每日一看

数据结构:
1.逻辑结构(关系)

线性结构:线性表  **栈**  队列
非线性结构: 树    图

2.存储结构:

 **顺序存储**
 链式存储

注意啦:以下是本人介绍哦
📕作者简介:S学长,致力于C/C++、嵌入式。从事嵌入式行业,热爱健身,身体倍棒的一位博主。
📗本文收录于爱上Linux系列,大家有兴趣的可以看一看
📘相关专栏C语言嵌入式开发、C语言入门系列等,日常Bug集期待你的指导。
📙S学长爱上Linux系列正在发展中,喜欢嵌入式的朋友们可以关注一下哦!


顺序栈

1.1 数据类型

在这里插入图片描述
代码示例:

typedef struct seqstakc{
    datatype data[SIZE];
    int top;    //表示栈顶数据下标
}seq_stack,*seq_pstack;

2.功能函数

2.1 初始化

void seqstack_init(seq_pstack * S)
{
    *S = (seq_pstack)malloc(sizeof(seq_stack));
    if(NULL == *S){
	perror("malloc");
	exit(1);
    }
    (*S)->top = -1;

2.2 入栈

判断栈是否已满,top 先++,再将数据放入数组中。

bool seqstack_push(seq_pstack s,datatype data)
{
    //判断栈是否满
    if(seqstack_is_full(s)){
	printf("栈已满\n");
	return false;
    }
    
    s->top++;
    s->data[s->top] = data;
    return true;
}

2.3 出栈

判空,取数据,top–

bool seqstack_pop(seq_pstack s,datatype *D)
{
    //判断栈是否空
    if(seqstack_is_empty(s)){
	printf("栈为空\n");
	return false;
    }
    *D = s->data[s->top];
    s->top--;
    return true;
}

测试:输入数据压入,输入字符弹出。

切记要用,getchar()清空缓冲区。

while(1){
	printf("请输入整数:");
	ret = scanf("%d",&data);//整数可以取到,其余跳过,留在缓冲区
	if(ret){
	    //输入整数,入栈
	    if(seqstack_push(s,data))
		 seqstack_travel(s);
	    else
		printf("入栈失败\n");
	}else{
	    //输入字符,出栈    没有获取到整数
	    if(seqstack_pop(s,&data))
		printf("出栈-->%d\n",data);
	    seqstack_travel(s);
	    while(getchar() != '\n');  //清空输入缓冲区
	}
    }

编写Makefile

CC = gcc
CFLAGS= -Wall -g -O0

SRC = ${wildcard *.c}
APP = test

$(APP) : $(SRC)
	$(CC) $(CFLAGS) -o $@  $^

clean:
	$(RM) $(APP) 

运行结果

在这里插入图片描述
练习:用栈进行数据的进制转换
在这里插入图片描述


如果这份博客对大家有帮助,希望各位给S学长一个免费的点赞👍作为鼓励,并评论收藏一下⭐,谢谢大家!!!
制作不易,如果大家有什么疑问或给S学长的意见,欢迎评论区留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不二哈_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值