本节实验课总体安排:
1、把理论课剩下的几节广义表讲完。
2、回顾上节课内容,设计一道栈和队列的编程题。
3、熟悉本章内容,设计一道串的算法题。
4、给同学们介绍2025金砖大赛低零代码大赛,低代码的相关知识和赛项的注意事项。
一、栈和队列的程序题
回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good” 不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define StackSize 100
typedef char DataType;
typedef struct {
DataType data[StackSize];
int top;
} SeqStack;
// Initialize stack
void InitStack(SeqStack *s) {
s->top = -1;
}
// Check if stack is empty
bool EmptyStack(SeqStack *s) {
return s->top == -1;
}
// Push operation
bool Push(SeqStack *s, DataType x) {
if (s->top == StackSize - 1)
return false; // Stack overflow
s->data[++(s->top)] = x;
return true;
}
// Pop operation
DataType Pop(SeqStack *s) {
if (EmptyStack(s))
return '\0'; // Stack underflow
return s->data[(s->top)--];
}
// Check if string is palindrome
bool IsHuiwen(char *t) {
SeqStack s;
int i, len;
char temp;
InitStack(&s);
len = strlen(t);
for (i = 0; i < len / 2; i++)
Push(&s, t[i]);
if (len % 2 != 0)
i++;
while (!EmptyStack(&s)) {
temp = Pop(&s);
if (temp != t[i])
return false;
i++;
}
return true;
}
// Main function
int main() {
char str[StackSize];
scanf("%s", str);
if (IsHuiwen(str))
printf("true\n");
else
printf("false\n");
return 0;
}
二、上述代码讲解
一、算法思路(核心思想)
回文的定义:正着读和反着读完全一样的字符串。
判断思路是:
- 把字符串前一半的字符依次入栈;
- 如果字符串长度是奇数,跳过中间那个字符;
- 然后从后一半开始,与栈顶元素依次比较:
- 如果每次都相等 → 是回文;
- 若有不等 → 不是回文。
因为栈的后进先出(LIFO)特性,弹出顺序正好与输入顺序相反,能实现“反读”的效果。
二、栈结构与操作函数
1栈的定义
typedef struct {
DataType data[StackSize];
int top;
} SeqStack;
- data:用数组保存栈中元素(最大100个);
- top:栈顶指针(初始化为 -1 表示空栈)。
2 初始化函数
void InitStack(SeqStack *s) {
s->top = -1;
}
将 top 设为 -1,表示栈为空。
3 判空函数
bool EmptyStack(SeqStack *s) {
return s->top == -1;
}
当 top == -1 时返回 true,说明栈中没有元素。
4入栈操作
bool Push(SeqStack *s, DataType x) {
if (s->top == StackSize - 1)
return false; // 栈满
s->data[++(s->top)] = x;
return true;
}
若栈没满,先 top++ 再把元素放进去;
- 用于压入字符。
5 出栈操作
DataType Pop(SeqStack *s) {
if (EmptyStack(s))
return '\0'; // 栈空返回空字符
return s->data[(s->top)--];
}
若栈非空,返回栈顶元素,并将 top 减 1;
- 实现“后进先出”。
三、判断是否为回文的核心函数
bool IsHuiwen(char *t) {
SeqStack s;
int i, len;
char temp;
InitStack(&s);
len = strlen(t);
for (i = 0; i < len / 2; i++)
Push(&s, t[i]);
👉 第一步:将前半部分入栈
- 若字符串 "abba" → len = 4,前一半是 "ab";
- 若 "abdba" → len = 5,前一半 "ab" 入栈,d 是中间字符。
if (len % 2 != 0)
i++;
👉 第二步:若长度为奇数,跳过中间字符
比如 "abdba",len=5 是奇数,i=2 时跳过 d(中间字符)。
while (!EmptyStack(&s)) {
temp = Pop(&s);
if (temp != t[i])
return false;
i++;
}
👉 第三步:依次出栈并比较
- 每次弹出一个栈顶字符;
- 与字符串后半部分的字符 t[i] 对比;
- 若有一个不等,则不是回文;
- 若全部相等,则是回文。
return true;
}
👉 第四步:全部匹配成功则返回 true。
四、主函数
int main() {
char str[StackSize];
scanf("%s", str);
if (IsHuiwen(str))
printf("true\n");
else
printf("false\n");
return 0;
}
从输入中读取一个字符串;
- 调用 IsHuiwen() 判断;
- 输出结果 true 或 false。
五、举个例子:输入 "abdba"
|
步骤 |
栈内容(top→) |
当前字符对比 |
说明 |
|
入栈阶段 |
a → b |
— |
压入前半部分“ab” |
|
跳过中间字符 |
— |
d |
奇数长度跳过“d” |
|
出栈比较1 |
栈顶 b |
b |
匹配 |
|
出栈比较2 |
栈顶 a |
a |
匹配 |
|
栈空结束 |
— |
— |
全部匹配 → 回文 |
输出:true
三、串的算法题
leetcode 3 给定一个字符串,找出不含有重复字符的最长子串的长度。
int lengthOfLongestSubstring(char* s)
{
int max = 0;
int left = 0,right = 0;
int i = 0;
int length = strlen(s);
for(int i=0; i<length; i++){
if(left<=right){
for(int j=left;j<right;j++)
{
if(s[j]==s[right]){
left =j+1;
break;
}
}
}
max = max <(right-left+1) ? (right-left +1):max;
right++;
}
return max;
}
四、上述代码讲解
一、题目要求
给定一个字符串 s,请找出其中 不包含重复字符的最长子串的长度。
例如:
|
输入 |
输出 |
解释 |
|
"abcabcbb" |
3 |
最长子串是 "abc" |
|
"bbbbb" |
1 |
最长子串是 "b" |
|
"pwwkew" |
3 |
最长子串是 "wke" |
二、算法核心思路 —— 滑动窗口
滑动窗口 是一种常用的字符串或数组算法技巧。
用两个指针 left 和 right 来维护一个当前无重复子串的范围 [left, right)。
算法流程:
- 初始时,窗口为空:left = 0, right = 0
- 每次扩大 right(右指针向右移动);
- 如果发现有重复字符,就移动 left(左指针)缩小窗口;
- 在每次操作后,更新当前窗口的最大长度。
三、代码讲解(逐行分析)
int lengthOfLongestSubstring(char* s)
{
int max = 0; // 保存当前找到的最大子串长度
int left = 0, right = 0; // 滑动窗口的左右边界
int length = strlen(s); // 字符串长度
for (int i = 0; i < length; i++) {
if (left <= right) {
for (int j = left; j < right; j++) {
if (s[j] == s[right]) { // 如果在窗口中发现重复字符
left = j + 1; // 将左边界移到重复字符的下一个位置
break;
}
}
}
max = max < (right - left + 1) ? (right - left + 1) : max; // 更新最大长度
right++; // 扩大右边界
}
return max;
}
四、关键步骤详细说明
1. left 和 right 是窗口的左右边界
它们代表当前子串 s[left...right] 没有重复字符。
- 每次循环,right 向右移动一个字符;
- 若新加入的字符与窗口内已有字符重复,则移动 left。
2. 检查是否重复
for (int j = left; j < right; j++) {
if (s[j] == s[right]) {
left = j + 1;
break;
}
}
这一段代码的作用是:
- 从 left 到 right-1 扫描当前窗口;
- 一旦发现 s[right] 已在窗口中存在(重复字符),
就把 left 移动到重复字符的下一个位置; - 这样新的窗口 [left, right] 内重新保证没有重复字符。
3. 更新最大长度
max = max < (right - left + 1) ? (right - left + 1) : max;
- 每次窗口变化时,计算当前窗口长度 (right - left + 1);
- 如果比历史最大值 max 大,就更新它。
4. 移动右指针
right++;
向右扩张窗口,不断尝试加入新的字符。
五、运行过程举例:输入 "abcabcbb"
|
步骤 |
left |
right |
当前窗口 |
新字符 |
是否重复 |
更新后left |
max |
|
1 |
0 |
0 |
"" |
'a' |
否 |
0 |
1 |
|
2 |
0 |
1 |
"a" |
'b' |
否 |
0 |
2 |
|
3 |
0 |
2 |
"ab" |
'c' |
否 |
0 |
3 |
|
4 |
0 |
3 |
"abc" |
'a' |
✅ 重复 |
1(跳过旧a) |
3 |
|
5 |
1 |
4 |
"bca" |
'b' |
✅ 重复 |
2 |
3 |
|
6 |
2 |
5 |
"cab" |
'c' |
✅ 重复 |
3 |
3 |
|
7 |
3 |
6 |
"abc" |
'b' |
✅ 重复 |
5 |
3 |
|
8 |
5 |
7 |
"b" |
'b' |
✅ 重复 |
7 |
3 |
最后 max = 3,即最长子串 "abc"。
五、2025金砖国家低代码开发大赛
1、低代码开发介绍
【这里以明道云平台为例子,本赛事有专门的开发平台,仅用来向同学们展示低代码开发流程】
一、什么是低代码开发?
低代码开发 是一种利用 图形化界面 + 少量代码 来构建应用的软件开发方式。
它的目标是让:
- 专业开发者能 更快地交付系统;
- 非程序员(如业务人员)也能 参与应用搭建。
💡 用一句话总结:
“低代码 = 用拖拽、配置代替大量手写代码。”
常见低代码平台有:
- 企业类:Mendix、OutSystems、Power Apps、阿里云宜搭、华为云应用魔方
- 测试类/自动化类:Testin、Tencent WeTest、蓝湖Flow、简道云
二、低代码开发的一般流程
可以分为 六个阶段 👇
① 需求分析与建模
目标: 明确业务逻辑、系统结构。
主要任务:
- 与业务方沟通,梳理流程、角色、数据对象;
- 在平台上创建 业务模型 / 数据模型;
- 设计实体(如用户、订单、项目)及字段关系。
工具操作:
- 用平台的“数据建模器”拖出实体关系;
- 定义字段类型(文本、日期、数值、引用等);
- 设计流程图或用例图。
产出:
业务需求文档、数据模型、初步流程图。
② 页面设计(前端界面搭建)
目标: 设计用户可见的交互界面。
主要任务:
- 通过 拖拽组件(表单、表格、按钮、图表)构建页面;
- 配置页面与数据表的绑定;
- 设置交互逻辑(如点击按钮触发流程)。
工具操作:
- 拖拽UI控件;
- 用“属性面板”设置样式与事件;
- 可嵌入少量脚本(JavaScript、逻辑表达式)。
产出:
动态页面原型 + 交互逻辑配置。
③ 业务逻辑与流程配置
目标: 定义应用的行为逻辑(类似后端逻辑)。
主要任务:
- 设计工作流(Workflow);
- 设置条件判断、循环、分支;
- 调用API、数据库操作;
- 定义触发条件(如提交表单 → 审批流 → 发邮件)。
工具操作:
- 拖拽“流程节点”(如条件判断、任务节点、接口调用);
- 用“可视化流程图”连接逻辑;
- 在必要处编写简短代码块。
产出:
业务流程配置文件、触发规则、API绑定。
④ 数据集成与系统对接
目标: 让低代码应用与外部系统交互。
主要任务:
- 调用外部API;
- 对接数据库或中台系统;
- 绑定第三方服务(如支付、短信、AI接口)。
工具操作:
- 配置 RESTful 接口;
- 绑定数据源;
- 设置认证与参数映射。
产出:
接口配置文档、连接测试结果。
⑤ 测试与发布
目标: 验证应用功能是否正确。
主要任务:
- 平台自带“预览模式”进行交互测试;
- 编写自动化测试脚本(若平台支持);
- 在测试环境发布并验证;
- 无误后推送到生产环境。
工具操作:
- “一键预览”运行;
- 使用内置调试控制台;
- 低代码平台通常提供“版本回滚”功能。
产出:
测试报告、发布版本记录。
⑥ 维护与运营
目标: 监控运行、优化性能、版本迭代。
主要任务:
- 收集用户反馈;
- 修改数据模型或流程;
- 快速热更新(无需重新部署)。
工具操作:
- 平台的“日志分析”或“性能监控”界面;
- 在线编辑并保存新版本;
- 支持灰度发布。
产出:
优化后的版本、运维报告。
三、低代码开发流程一览图
┌──────────────────────────┐
│ ① 需求建模 │→ 数据建模 │
└──────┬──────────────┘
↓
┌──────────────────────────┐
│ ② 页面设计(拖拽UI) │
└──────┬──────────────┘
↓
┌──────────────────────────┐
│ ③ 业务流程配置(逻辑流) │
└──────┬──────────────┘
↓
┌──────────────────────────┐
│ ④ 系统集成 / API绑定 │
└──────┬──────────────┘
↓
┌──────────────────────────┐
│ ⑤ 测试与部署 │
└──────┬──────────────┘
↓
┌──────────────────────────┐
│ ⑥ 维护与版本迭代 │
└──────────────────────────┘
四、低代码开发的角色分工
|
角色 |
主要职责 |
|
业务分析师(BA) |
提炼业务流程,建模 |
|
开发人员 |
负责复杂逻辑与接口开发 |
|
测试工程师 |
执行功能测试、回归测试 |
|
业务人员 / 运营 |
使用可视化工具修改配置 |
|
平台管理员 |
管理部署与权限 |
五、低代码的优缺点总结
|
优点 |
缺点 |
|
快速开发、交付周期短 |
灵活性不如手写代码 |
|
图形化界面,易于上手 |
平台封闭,难迁移 |
|
支持自动化测试与发布 |
性能优化空间有限 |
|
适合原型验证、小型系统 |
大型复杂业务可能受限 |
六、典型应用场景
- 企业审批系统(请假、报销、采购)
- 数据填报与可视化看板
- 测试用例管理、缺陷跟踪平台
- 教育管理平台、实验教学系统
- 智能测试脚本可视化生成(AI + 低代码)
2、在本校是学科竞赛一类一般
3、主要的困难:比赛时间长(6h)+培训需要付费30R
1537

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



