数据结构代码集训day14(适合考研、自学、期末和专升本)

本文主要是介绍数据结构代码集训day14(适合考研、自学、期末和专升本),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目均来自b站up:白话拆解数据结构


今日题目如下:
1)试写一个算法判断给定字符序列是否是回文。

(2)给定一个算法判断输入的表达式中括号是否匹配。假设只有花、中、尖三种括号。


题1

        回文序列即正着读反着读,都是一样的。比如abba就是回文序列,abab就不是。

        由于要反着读,能够很容易想到一种线性结构——栈。栈后进先出,很容易实现输入序列的反序,其实将字符串存进数组或者链表里面反转一下也能做。这里扩充一下用栈的做法。

        我们将字符序列用字符数组存起来,然后将数组的前半部分入栈,然后依次出栈和数组的后半部分依次比较,全部相等就是回文序列,否则就不是

        此处偷懒,不定义栈的结构体了,直接调用库<stack>就行了。注意如果字符串是奇数,就跳过这个,因为ababa中间的a正反着读都在原位置,这个元素就没用。

bool huiwen(char s[]) {

    if (s[0] == '\0') {

        cout << "false" << endl;

        return false;

    }

    stack<char> t;        // 初始化一个栈

    int len = strlen(s);

    // 将前半部分字符压入栈中

    for (int i = 0; i < len / 2; ++i) {

        t.push(s[i]);        // 入栈

    }

    // 如果字符串长度为奇数,跳过中间的字符

    int start = (len % 2 == 0) ? len / 2 : len / 2 + 1;

    // 比较后半部分字符和栈顶字符

    for (int i = start; i < len; ++i) {

        if (t.top() != s[i]) {

            cout << "wu huiwen" << endl;

            return false;

        }

        t.pop();        // 出栈

    }

    cout << "have huiwen" << endl;

    return true;

}

 实践一下:
输入aabaa

输入aabaac

完整代码如下:

#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;// 判断给定字符序列是否是回文
bool huiwen(char s[]) {if (s[0] == '\0') {cout << "false" << endl;return false;}stack<char> t;int len = strlen(s);// 将前半部分字符压入栈中for (int i = 0; i < len / 2; ++i) {t.push(s[i]);}// 如果字符串长度为奇数,跳过中间的字符int start = (len % 2 == 0) ? len / 2 : len / 2 + 1;// 比较后半部分字符和栈顶字符for (int i = start; i < len; ++i) {if (t.top() != s[i]) {cout << "wu huiwen" << endl;return false;}t.pop();}cout << "have huiwen" << endl;return true;
}int main(){char s[]="aabaac";huiwen(s);return 0;
}

题2

        就是括号匹配,遇到左括号就入栈,在左括号入栈后继续判断右括号是否匹配,如果匹配就全部出栈。

bool pipei(char s[]){

    stack<char> t;

    int len = strlen(s);

    for (int i = 0; i < len ; i++) {

        if(s[i]=='{'||s[i]=='('||s[i]=='<'){        // 入栈左括号

            t.push(s[i]);

        }

        else if (s[i] == '}' || s[i] == ')' || s[i] == '>') {

            if (t.empty()) {

                // 栈为空,说明没有匹配的左括号

                cout << "bu pi pei\n";

                return false;

            }

            char top = t.top();        // 暂存栈顶元素,用来匹配

            t.pop();

            // 检查是否匹配

            if ((s[i] == '}' && top != '{') ||(s[i] == ')' && top != '(') ||(s[i] == '>' && top != '<')) {

                cout << "bu pi pei\n";

                return false;

            }

        }

    }

    if (t.empty()){                // 栈空了,意味着全部匹配出栈了

        printf("pi pei\n");

    }

    else printf("bu pi pei\n");

    return true;

}    

实践:

 (ab<cd>{<ed>()})

(ab<cd>{<ed>(})

 完整代码如下:

#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;// 判断括号匹配
bool pipei(char s[]){stack<char> t;int len = strlen(s);for (int i = 0; i < len ; i++) {if(s[i]=='{'||s[i]=='('||s[i]=='<'){t.push(s[i]);}else if (s[i] == '}' || s[i] == ')' || s[i] == '>') {if (t.empty()) {// 栈为空,说明没有匹配的左括号cout << "bu pi pei\n";return false;}char top = t.top();t.pop();// 检查是否匹配if ((s[i] == '}' && top != '{') ||(s[i] == ')' && top != '(') ||(s[i] == '>' && top != '<')) {cout << "bu pi pei\n";return false;}}}if (t.empty()){printf("pi pei\n");}else printf("bu pi pei\n");return true;
}    int main(){char s[]="(ab<cd>{<ed>(})";pipei(s);return 0;
}

这篇关于数据结构代码集训day14(适合考研、自学、期末和专升本)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131783

相关文章

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Java强制转化示例代码详解

《Java强制转化示例代码详解》:本文主要介绍Java编程语言中的类型转换,包括基本类型之间的强制类型转换和引用类型的强制类型转换,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录引入基本类型强制转换1.数字之间2.数字字符之间引入引用类型的强制转换总结引入在Java编程语言中,类型转换(无论

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

使用Dify访问mysql数据库详细代码示例

《使用Dify访问mysql数据库详细代码示例》:本文主要介绍使用Dify访问mysql数据库的相关资料,并详细讲解了如何在本地搭建数据库访问服务,使用ngrok暴露到公网,并创建知识库、数据库访... 1、在本地搭建数据库访问的服务,并使用ngrok暴露到公网。#sql_tools.pyfrom