数据结构实验五 串、数组和广义表

本节实验课总体安排:

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;
}

二、上述代码讲解

一、算法思路(核心思想)

回文的定义:正着读和反着读完全一样的字符串

判断思路是:

  1. 把字符串前一半的字符依次入栈
  2. 如果字符串长度是奇数,跳过中间那个字符;
  3. 然后从后一半开始,与栈顶元素依次比较:
    • 如果每次都相等 → 是回文;
    • 若有不等 → 不是回文。

因为栈的后进先出(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)。

算法流程:

  1. 初始时,窗口为空:left = 0, right = 0
  2. 每次扩大 right(右指针向右移动);
  3. 如果发现有重复字符,就移动 left(左指针)缩小窗口;
  4. 在每次操作后,更新当前窗口的最大长度。

三、代码讲解(逐行分析)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值