用栈来判断括号匹配问题

2023-11-19

用栈实现:输入一行符号,以#结束,判断其中的括号是否匹配。括号包括:

{ } 、 [ ] 、 ( )、  < >

如果匹配,输出 right

如果不匹配,给出错误提示。包括:

    (1)对称符号都匹配,输出 “ right “

    (2)处理到某个符号时不匹配了,输出 " The $ character '*' is wrong." ,其中$是出错符号的序号,*是出错的符号;

    (3)如果有没匹配的左符号,输出缺失的对应的右符号,即输出 “loss of right character 。。。.”,其中。。。是按嵌套顺序对应的右符号。

例如:

输入 Result
as(*x<{(({<>}))}>)#
right
(a.b)>#
The 6 character '>' is wrong.
({()#
loss of right character }).
#include<iostream>
#include<stack>
#include<string>

using namespace std;
int cnt=0;
char a[1000];
bool flag=false;

class SeqStack{
public :
    int *a;
    int top;
public:
    SeqStack()
    {
        a=new int[105];
        top=-1;
    }
    void Push(int x)
    {
        a[++top]=x;
    }
    void Pop()
    {
        top--;
    }
    bool Empty()
    {
        if(top==-1) return true;
        return false;
    }
    int Top()
    {
        return a[top];
    }
};
void Judge(string str)    //使用栈判断括号匹配
{
    //stack <char>s;
    SeqStack s;
    int i=0;
    while(str[i]!='#')
    {
        switch (str[i])
        {
        case '(':
            s.Push('(');
            break;
        case '[':
            s.Push('[');
            break;
        case '<':
            s.Push('<');
            break;
        case '{':
            s.Push('{');
            break;

        case ')':
            if(!s.Empty())
            {
                if (s.Top() == '(')
                {
                    s.Pop();
                }
                else
                {
                    a[cnt]=s.Top();
                    cnt++;


                }
            }
            else
            {
                //s.push(')');
                cout<<"The "<<i+1<<" character"<<" '"<<str[i]<<"' is wrong."<<endl;
                flag=true;
            }
            break;
        case '>':
            if(!s.Empty())
            {
                if (s.Top() == '<')
                {
                    s.Pop();
                }
                else
                {
                    a[cnt]=s.Top();
                    cnt++;
                }
            }
            else
            {
                //s.push('>');
                cout<<"The "<<i+1<<" character"<<" '"<<str[i]<<"' is wrong."<<endl; flag=true;
            }
            break;
        case ']':
            if(!s.Empty())
            {
                if (s.Top() == '[')
                {
                    s.Pop();
                }
                else
                {
                    a[cnt]=s.Top();
                    cnt++;
                }
            }
            else
            {
                //s.push(']');
                cout<<"The "<<i+1<<" character"<<" '"<<str[i]<<"' is wrong."<<endl; flag=true;
            }
            break;
        case '}':
            if(!s.Empty())
            {
                if (s.Top() == '{')
                {
                    s.Pop();
                }
                else
                {
                    a[cnt]=s.Top();
                    cnt++;
                }
            }
            else
            {
                cout<<"The "<<i+1<<" character"<<" '"<<str[i]<<"' is wrong."<<endl;
            }
            break;
        }
        i++;
    }
    if (s.Empty()&& flag==false)
    {
        cout<<"right"<<endl;
    }
    else if(!s.Empty())
    {
        cout<<"loss of right character ";
        while(!s.Empty())
        {
            if(s.Top()=='<') cout<<">";
            if(s.Top()=='(') cout<<")";
            if(s.Top()=='{') cout<<"}";
            if(s.Top()=='[') cout<<"]";
            s.Pop();
        }
        cout<<'.'<<endl;
    }
   if(cnt)
    {
        cout<<"loss of right character ";
        for(int i=0; i<cnt; i++)
        {
            cout<<a[i];
        }
        cout<<endl;
    }

}

int main()
{
    string str;
    cin >> str;
    Judge(str);
//	system("pause");
    return 0;

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用栈来判断括号匹配问题 的相关文章

  • 转JSON报错怎么办?增加发生js错误时候的代码强壮性

    在js中有些内置方法在使用的时候当传入意外类型参数的时候会报错卡死导致直接让整个项目都跑不起来了 比如 今天 这里就说一个增加代码强壮性的方法 try catch finally 众所周知 try catch 是处理意外错误时候的语句 主要
  • 《R语言实战》学习笔记:第一章 R语言介绍

    R语言实战 学习笔记 第二章 创建数据集 R语言实战 学习笔记 第三章 图像初阶 R语言实战 学习笔记 第四章 基本数据管理 R语言实战 学习笔记 第五章 高级数据管理 R语言介绍 数值运算 age lt c 1 3 5 2 11 9 3

随机推荐

  • 【Zabbix实战之部署篇】Zabbix的分布式监控部署

    Zabbix实战之部署篇 Zabbix的分布式监控部署 一 Zabbix proxy介绍 1 Zabbix proxy简介 2 Zabbix proxy 使用场景 3 Zabbix的分布式监控拓扑 二 检查本地环境 1 本地环境规划 2 检
  • React中文

    1 Hello World 开始React最简单的方式是在CodePen上使用HelloWorld例子 你不需要安装任何东西 你只要在新的标签页中打开并和我们一起看例子 如果你想要使用一个本地开发环境 可参看Installation页 最小
  • Palindrome Partitioning II

    Calculate and maintain 2 DP states pal i j which is whether s i j forms a pal d i which is the minCut for s i n 1 Once w
  • Java NIO实现WebSocket服务器

    简介 在HTTP请求中 服务器往往处于被动的一方 通常都是客户端向服务器发送请求时 服务器才会做出响应 服务器并不会主动向客户端推送消息 因此WebSocket API就为此诞生 WebSocket API是HTML5中的一大特色 能够使得
  • 第三方对接-支付宝支付接入教程

    对接支付宝支付接口 官方文档已经写的很清楚了 但是也有很多小白 第一次对接支付宝支付接口 会有些迷茫 所以我在此写下这篇文章 如果你已经支付宝对应 第一步 创建应用与配置密钥已经熟悉了 这里可以不用看这篇文章了 第一步 创建应用 开发者使用
  • python使用Queue(避坑指南)

    python Queue 常见的队列类别 常见的索取 判断函数 避坑部分 常见的队列类别 class one 普通队列 先进先出 from queue import Queue 导入 temp Queue maxsize 5 申请一个能存放
  • 时间、时间戳互转、日期格式化、获取各种天数

    我们在工作中经常遇到日期格式的转换 比如获取当前时间 转换当前时间格式为2023 09 09 2023 09 09 2023 09 09 18 12 01 时间戳 时间戳转日期 日期转时间戳 获取当前季度 获取上一季度 获取下一季度 获取下
  • java编辑pdf(itextpdf)

    工作上遇到一个小需求 需要在原有的pdf文件上添加一行文字 实现方式如下 引入依赖
  • STM32Cube学习(5)——PWM

    1 引言 单片机 STM32F407ZGT6 仿真器 ST Link V2 开发环境 STM32CubeIDE 1 10 1 功能说明 使用单片机定时器产生PWM实现呼吸灯效果 前情提要 STM32Cube学习 1 点灯 配置 STM32C
  • 使用DataGrip连接SQL Server 2017数据库

    微软的SQL Server数据库是做 NET开发的好朋友 现在最新的版本是2017 SQL Server数据库有自己的Management Studio工具 基本用起来和Visual Studio差不多 当然除了官方的工具之外 其他的数据库
  • Docker安装mysql8.0文档

    第一步需要安装Docker基础环境 具体可以看看这篇 docker基础篇 第二步 拉取mysql8 0的镜像 docker pull mysql 8 0 第三步 镜像启动和文件挂载 复制下面命令执行 33006是对外访问暴露的端口 当然你也
  • python的数据类型有哪些其中哪些是不可变的_python可变数据类型有哪些

    将python3的基本数据类型有六种 Number int float bool complex String List Tuple Dictionary Set 可变数据类型 list dic set 不可变数据类型 Number Str
  • IntelliJ IDEA使用教程

    文章目录 1 IntelliJ IDEA首创项目 2 外观样式 3 类的相关操作 4 模块 1 IntelliJ IDEA首创项目 project 微信主界面 module 下栏 消息 通讯录 发现 我 package 聊天记录 文字 图片
  • SSH密钥过期

    我去 很久没用这个项目 突然发现repo sync 不好用了 发现原来是SSH密钥过期了 1 查看id rsa pub是否存在 ls ssh 2 将里面的东西复制出来 3 重新添加下 SSH Public Key 4 再次运行 repo s
  • 我的和unity3d的小故事1——恶魔射手之鼠标控制移动之input.getaxis("Horizontal")与input.getaxis("Vertical")

    跟着恶魔射手视频学习的过程中遇到的第一个问题是怎么也移动不了 那么问题来了 打印出来是获得的下面两个值都是0 怎么办呢 改edit下面的projectsetting里面的input属性下面两个值的type都改成mouse movement
  • es head 复合查询_【ES进阶】深入理解Elasticsearch检索评分score执行计划及逆向文档词频idf...

    在前面的课程中 通过搭建ELK相关的中间件 以及配置动态mapping结构用于存储我们需要检索的文档信息 我们通过输入关键词进行分词检索然后ES默认通过评分的形式将数据排序好展示给我们 当文档评分越高 那么搜索的结果越靠前 如下图所示 我们
  • 原型和原型链

    好久没记了有点忘记了 来记录一下 1 函数和对象的关系 对象都是通过函数创建的 函数也是一个对象 2 原型和原型链 1 原型 原型分为两种 prototype 每一个函数都会有prototype属性 它指向函数的原型对象 被称为显式原型 p
  • unity3d之 C# WaitFOrSeconds()

    学习unity3d不久 在使用WaitFOrSeconds 时 遇到了不少麻烦 故记录 以警示后人 首先介绍C 和javascript 在使用它有很大的区别 javascript可以直接使用 yield WaitFOrSeconds 5 即
  • 腾讯云 API 网关产品发布

    欢迎大家前往腾讯云社区 获取更多腾讯海量技术实践干货哦 腾讯云已在近期上线了 API 网关产品 协助开发者通过简单方式即可完成 API 配置管理 发布版本 访问控制等功能 并可进一步对接腾讯云云市场中的 API 市场 参与到 API 经济的
  • 用栈来判断括号匹配问题

    用栈实现 输入一行符号 以 结束 判断其中的括号是否匹配 括号包括 lt gt 如果匹配 输出 right 如果不匹配 给出错误提示 包括 1 对称符号都匹配 输出 right 2 处理到某个符号时不匹配了 输出 The character