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

news2024/9/23 5:34:56

题目均来自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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习笔记 | 一文搞懂MySQL体系架构!!!(day22)

本文章的内容会在后面文章中慢慢讲解&#xff0c;该文章主要给各位博友zaipin提供学习思路&#xff0c;也希望大家在评论区发言表述&#xff0c;觉得文章有不足指出也可点评&#xff0c;希望大家多多支持&#xff01;&#xff01;&#xff01; 目录 一、MySQL 1.1 数据库概述 …

【项目日记】高并发内存池---实现页缓存

放纵自己的欲望是最大的祸害&#xff1b; 谈论别人的隐私是最大的罪恶&#xff1b; 不知自己过失是最大的病痛。 --- 亚里士多德 --- 高并发内存池---实现页缓存 1 页缓存整体设计思路2 框架搭建3 NewSpan函数4 请求Span联动 1 页缓存整体设计思路 首先我们来看页缓存的设…

windows手工杀毒-寻找可疑进程之进程名称

上篇回顾&#xff1a;windows手工杀毒-寻找可疑进程之进程图标-CSDN博客 上篇中我们简单介绍了什么是电脑病毒&#xff0c;也介绍了一种发现可疑进程的方法即根据进程图标确认是否是病毒&#xff0c;这种方法存在的理论基础是&#xff0c;通过图标可以很容易在电脑上找…

遥控器新手操作指南!!!

一、准备工作 检查电量&#xff1a;确保无人机和遥控器的电池电量充足&#xff0c;以避免在飞行过程中因电量不足而导致意外。 安装与连接&#xff1a;确保无人机的螺旋桨安装正确且牢固&#xff0c;同时检查无人机存储卡是否插入&#xff0c;以及遥控器与无人机之间的连接是…

论文笔记:2023顶会SIGIR - Strategy-aware Bundle Recommender System

论文笔记&#xff1a;2023顶会SIGIR - Strategy-aware Bundle Recommender System

【位运算】--- 初阶题目赏析

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey 根据上一篇位运算的总结&#xff0c;我们来体会几道初阶题目。 &#x1f3e0; 判定字符是否唯一 &#x1f4cc; 题目解析 判定字符是否唯一…

通义千问AI PPT初体验:一句话、万字文档、长文本一键生成PPT!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

leecode刷题经典算法套路模版笔记【递归回溯篇】--根本逻辑,快速掌控

刷题套路总结&#xff1a; 双指针&#xff1a; 单调性&#xff1b;对两端按照规律进行操作移动&#xff1b; 常见移法&#xff0c;右指针右移扩大范围&#xff0c;左指针左移缩小范围&#xff1b; 先举例模拟&#xff0c;然后推导公式&#xff1b; 递归&#xff0c;回溯 &am…

线程间同步的方式有哪些?

Linux 系统提供了五种用于线程间同步的方式&#xff1a;互斥锁、读写锁、自旋锁、信号量、条件变量 互斥锁 主要用于保护共享数据&#xff0c;确保同一时间内只有一个线程访问数据。 互斥量本质上来说就是一把锁&#xff0c;在访问共享资源前对互斥量进行加锁&#xff0c;访…

【go-zero】win启动rpc服务报错 panic: context deadline exceeded

win启动rpc服务报错 panic: context deadline exceeded 问题来源 在使用go-zero生成的rpc项目后 启动不起来 原因 这个问题原因是wndows没有启动etcd 官方文档是删除了etcd配置 而我自己的测试yaml配置有etcd&#xff0c;所以需要启动etcd 下载安装好etcd后&#xff0…

Java Full GC 的常见原因及优化策略

Java Full GC 的常见原因及优化策略 1、导致Full GC的常见原因1.1 新生代设置过小1.2 新生代设置过大1.3 Survivor区设置不当 2、优化GC策略2.1 吞吐量优先2.2 暂停时间优先 3、结论 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java应…

自控原理-传递函数(闭环 扰动 偏差 前馈 复合 顺馈)

都知道闭环传递函数定义为&#xff1a;G1G2/(1G1G2H) 但是当碰到复杂的系统&#xff0c;比如复合顺馈&#xff0c;前馈扰动等&#xff0c;就不知道分子到底要不要乘上G2了。 这个公式是如何推导出来的&#xff0c;今天看到一个公式图片&#xff1a; 过程非常详细。 由此我也…

C语言遇见的一些小问题

问题如下&#xff1a; 1&#xff1a;为什么这样的代码为报错 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <algorithm> #include <cstdio> #include<string> #include<stdlib.h> using namespace std; int main() {int i …

C语言 ——— #define定义标识符

目录 #define 定义常变量 #define 定义字符串 #define 定义一条代码 #define 定义的标识符是否需要加分号 #define 定义常变量 代码演示&#xff1a; #define M 100 //定义常变量 代码用途&#xff1a; int a M; int arr[M] { 0 }; 此时的 M 具有常属性&#xff0c…

什么是UART?

1.什么是UART&#xff1f; 通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;通常称作UART。UART 表示通用异步接收机/发射机&#xff0c;定义用于在两个设备之间交换串行数据的协议或一组规则。UART 非常简单&#xff0c;仅在发射机和…

C语言中static与extern关键字的深入解析

在C语言编程中&#xff0c;static和extern是两个非常重要的关键字&#xff0c;它们各自有着独特的用途。本文将深入探讨这两个关键字的工作原理、底层实现机制以及在实际开发中的应用。 static关键字 1. 原理与作用 static关键字用于声明变量或函数具有特定的作用域和生命周…

5.4分段线性灰度变换

目录 实验原理 分段线性灰度变换的概念 变换函数的形式 示例代码1 示例结果1 示例代码2 示例结果2 示例代码3 运行结果3 示例代码4 运行结果4 实验原理 在OpenCV中&#xff0c;分段线性灰度变换&#xff08;Piecewise Linear Gray Level Transformation&#xff09…

GitLab 是什么?GitLab使用常见问题解答

GitLab 是什么 GitLab是由GitLab Inc.开发&#xff0c;使用MIT许可证的基于网络的Git仓库管理工具开源项目&#xff0c;且具有wiki和issue跟踪功能&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。 ​GitLab 是由 GitLab Inc.开发&#xff0c…

【Prometheus】Prometheus的特点、数据采集方式、架构、数据模型详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

vue3整合antv x6实现图编辑器快速入门

安装&#xff1a; npm install antv/x6 --save如果使用 umd 包&#xff0c;可以使用下面三个 CDN 中的任何一个&#xff0c;默认使用 X6 的最新版&#xff1a; https://unpkg.com/antv/x6/dist/index.jshttps://cdn.jsdelivr.net/npm/antv/x6/dist/index.jshttps://cdnjs.clo…