是不是很多新手刚学数据结构,一碰到数组和栈的编程例题就犯难?“写数组遍历总出现越界错误,程序一跑就崩溃”“栈的入栈出栈搞反顺序,例题答案总是不对”“看解析觉得懂了,自己动手写代码却处处卡壳”?别慌,数组和栈是数据结构的基础,也是编程入门的必学内容,只要掌握基本概念和例题思路,新手也能快速上手。今天兔子哥就带大家从基础概念到实战例题,把数组与栈的编程入门题讲透,全是白话解析,跟着做就行,一起往下看吧!
先说说:数组和栈到底是啥?为啥例题总考它们?
很多人觉得 “数组不就是存数据的盒子吗,栈不就是叠盘子吗”,可一到编程例题就懵。其实数组和栈是最基础的数据结构,几乎所有编程入门考试、面试都会考,掌握它们能帮你打好编程逻辑的底子,后面学复杂结构更顺。
用大白话解释核心概念
- 数组:就像一排整齐的格子,每个格子有编号(下标),能存数据。比如存 5 个苹果的重量,按顺序放进格子里,想要哪个直接按编号拿,简单又直接。
- 栈:就像叠起来的盘子,只能从最上面放(入栈)或拿(出栈),底下的碰不着。特点是 “先进后出”,最后放的最先拿,比如浏览器的后退功能就是用栈实现的。
数组 vs 栈,特点对比一看就懂
| 类型 | 核心特点 | 常用操作 | 适合的例题场景 |
|---|---|---|---|
| 数组 | 下标访问快,大小固定,连续存储 | 初始化、遍历、修改 | 求最值、反转、元素统计 |
| 栈 | 先进后出,操作受限,顺序存储 | 入栈、出栈、取栈顶元素 | 括号匹配、进制转换、撤销操作 |
做编程辅导的李哥说:“我见过很多新手卡在数组和栈的例题上,其实这俩是基础中的基础,学会了能帮你理解‘数据存储’和‘操作逻辑’的核心,后面学链表、队列就简单多了。” 所以别小看这些基础题,练熟了比刷难题有用。
数组编程入门:从基础操作到经典例题,一步步来
数组是最常用的数据结构,例题大多围绕遍历、修改、统计这些操作,掌握基本思路,例题就能迎刃而解。
数组基础操作:初始化、遍历、修改,别踩这些坑
1. 数组初始化:给格子 “装数据”
定义数组就像画格子,比如
int arr[5] = {1, 2, 3, 4, 5};,就是画 5 个格子,分别装 1 到 5。新手常错:定义时格子数(长度)不够,比如存 6 个数据到长度 5 的数组里,会越界报错。2. 数组遍历:一个个 “看格子里的数”
遍历就是按顺序访问每个格子,用 for 循环最方便:
c
int arr[5] = {1,2,3,4,5};for (int i = 0; i < 5; i++) { // i从0开始,小于长度5printf("%d ", arr[i]); // 打印每个元素}新手常错:循环条件写成
i <= 5,导致访问arr[5]越界,记住下标最大是 “长度 - 1”。经典例题 1:求数组中的最大值
题目:输入 5 个整数,存到数组里,找出最大的数
思路:
- 定义数组存数据;
- 假设第一个元素是最大值;
- 遍历数组,每个元素和当前最大值比,比它大就更新最大值。
代码解析:
c
#include int main() {int arr[5], max;printf("请输入5个整数:");for (int i = 0; i < 5; i++) {scanf("%d", &arr[i]); // 存数据}max = arr[0]; // 假设第一个是最大的for (int i = 1; i < 5; i++) { // 从第二个开始比if (arr[i] > max) {max = arr[i]; // 更新最大值}}printf("最大值是:%d", max);return 0;}这题关键是 “假设初始最大值”,再遍历比较,新手容易忘了初始化 max,直接用 0 当初始值,要是数组全是负数就错了。
经典例题 2:反转数组元素
题目:把数组[1,2,3,4,5]反转成[5,4,3,2,1]
思路:
- 第一个和最后一个交换;
- 第二个和倒数第二个交换;
- 直到中间位置,不用重复交换。
代码解析:
c
#include int main() {int arr[5] = {1,2,3,4,5};int temp, len = 5;for (int i = 0; i < len/2; i++) { // 循环到中间temp = arr[i]; // 交换arr[i]和arr[len-1-i]arr[i] = arr[len-1-i];arr[len-1-i] = temp;}// 打印反转后数组for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);}return 0;}这里
len/2是关键,循环次数够了就停,新手常循环到最后一个元素,导致交换完又换回去,白忙活。栈编程入门:先进后出要记牢,例题思路很重要
栈的操作看着简单,可例题里总考细节,比如什么时候入栈、什么时候出栈,顺序错了结果就不对。
栈基础操作:入栈、出栈、取栈顶,操作顺序别搞反
1. 栈的初始化:准备 “叠盘子的地方”
用数组模拟栈最方便,定义一个数组和栈顶指针(top),top=-1 表示栈空:
c
int stack[100]; // 栈的存储空间int top = -1; // 栈顶指针,-1表示空栈2. 入栈:往栈顶放 “盘子”
c
void push(int data) {if (top >= 99) { // 栈满了printf("栈满了,不能入栈!");return;}stack[++top] = data; // 先移动指针,再存数据}新手常错:先存数据再移动指针,导致 top 位置不对,比如
stack[top++] = data,会漏存第一个元素。3. 出栈:从栈顶拿 “盘子”
c
int pop() {if (top == -1) { // 栈空了printf("栈空了,不能出栈!");return -1;}return stack[top--]; // 先拿数据,再移动指针}出栈要先判断栈是否为空,不然会拿无效数据,这是例题里的高频错误点。
经典例题 1:用栈判断括号是否匹配
题目:输入一串括号"()[]{}",判断是否匹配
思路:
- 遇到左括号((、[、{)就入栈;
- 遇到右括号就出栈顶元素,看是否匹配;
- 最后栈空说明全匹配,否则不匹配。
代码解析:
c
#include #include int main() {char s[100], stack[100];int top = -1;printf("请输入括号:");scanf("%s", s);for (int i = 0; i < strlen(s); i++) {if (s[i] == '(' || s[i] == '[' || s[i] == '{') {stack[++top] = s[i]; // 左括号入栈} else {if (top == -1) { // 右括号多了printf("不匹配");return 0;}char topChar = stack[top--];// 判断是否匹配if ((s[i] == ')' && topChar != '(') ||(s[i] == ']' && topChar != '[') ||(s[i] == '}' && topChar != '{')) {printf("不匹配");return 0;}}}if (top == -1) printf("匹配"); // 栈空才全匹配else printf("不匹配");return 0;}这题关键是 “左入右出”,新手容易漏判栈空的情况,比如输入 “))((”,一上来就出栈,直接错。
经典例题 2:用栈实现十进制转二进制
题目:输入一个整数,用栈转成二进制数
思路:
- 整数除以 2,余数入栈;
- 商继续除以 2,直到商为 0;
- 出栈余数,就是二进制数。
代码解析:
c
#include int main() {int num, stack[100], top = -1;printf("请输入整数:");scanf("%d", &num);if (num == 0) { // 特殊情况:0的二进制是0printf("二进制:0");return 0;}while (num > 0) {stack[++top] = num % 2; // 余数入栈num = num / 2;}printf("二进制:");while (top != -1) {printf("%d", stack[top--]); // 出栈打印}return 0;}这里要注意处理 0 的情况,新手常忘,导致输入 0 时没输出,这也是例题里的易错点。
错误排查:新手做数组和栈例题,最容易踩的 5 个坑
写代码时出错很正常,兔子哥整理了常见问题,遇到了照着改就行。
1. 数组越界,程序崩溃
比如
int arr[5],却访问arr[5],下标最大是 4。解决:循环条件用i < 长度,比如for (i=0; i<5; i++),别写成i <=5。2. 栈空时出栈,拿无效数据
调用
pop()前没判断top == -1,导致拿负数或乱码。解决:出栈前必须检查栈是否为空,加个判断语句。3. 栈满时入栈,数据存不进去
数组模拟的栈有最大长度,超过后入栈会覆盖数据。解决:入栈前判断
top >= 最大长度-1,满了就提示 “栈满”。4. 数组反转时循环次数错,数据没反转完
循环条件写成
i < len而不是i < len/2,导致反转后又换回去。解决:记住反转数组只需要循环到中间位置。5. 括号匹配时漏判栈空,右括号多了没检测
输入全是右括号,一上来就出栈,程序没报错却结果错。解决:遇到右括号先判断栈是否为空,空栈直接返回不匹配。
自问自答:新手做例题常见疑问
问:数组和栈都能用数组实现,它们有啥区别?
答:区别大了!数组能直接访问任意元素(按下标),栈只能访问栈顶元素;数组可以随便增删改,栈只能在栈顶操作(先进后出)。就像书架和叠盘子,书架能抽任意一层的书,叠盘子只能拿最上面的。
问:做例题时,什么时候该用数组,什么时候该用栈?
答:需要随机访问元素(比如查第 3 个元素)就用数组;需要按 “后进先出” 顺序处理(比如撤销操作、括号匹配)就用栈。例题里考顺序访问、统计数据的用数组,考逆序处理、配对问题的用栈。
问:看例题解析懂了,自己写还是错,咋办?
答:这是新手的通病!解决办法就是 “拆步骤 + 画流程图”。比如做括号匹配题,先画每个步骤的栈状态:入栈什么元素、出栈什么元素,画清楚了再写代码,比光看解析有用多了。兔子哥刚开始学的时候,一道题能画三张流程图,练多了就顺了。
个人心得:做例题别贪多,把基础题练熟更重要
兔子哥发现很多新手总想着刷难题,结果基础题还没吃透,越学越慌。其实数组和栈的入门例题就那么几种,把求最值、反转数组、括号匹配、进制转换这些题练熟,理解思路比背代码重要。
李哥带新人的经验是:“让他们把同一道题用不同方法做,比如反转数组,用循环交换做一遍,用指针做一遍,练到闭着眼都能写出来。基础扎实了,后面学复杂例题就不费劲。”
现在就从简单例题开始,一道题做三遍:第一遍抄解析理解思路,第二遍自己写代码,第三遍换种方法优化。遇到错误别慌,按排查方法找原因,多画流程图辅助理解。记住,编程例题不是考多难,而是考你有没有把基础概念吃透,练熟了自然就会了,加油!
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~